Autor Tema: Interface Cloneable y método clone del API Java. Cómo duplicar objetos CU00912C  (Leído 2460 veces)

LuisM

  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 131
    • Ver Perfil
Hola a todos !! Dejo a continuación el código del ejercicio propuesto
Desde ya muchas gracias por la atención.
Un saludo,
Luis
EJERCICIO
Define una clase que tenga cuatro atributos de tipo String cada uno de los cuales podrá ser exclusivamente una cadena de 12 ceros o de 12 unos. Es decir, cada atributo puede valer o bien "000000000000" ó bien "111111111111". La clase debe implementar la interface Cloneable y disponer de un método que permita ver el resultado de concatenar sus atributos.

Crea otra clase con el main donde crees un objeto cuyos atributos serán: "000000000000", "000000000000", "000000000000", "000000000000".

A partir de este primer objeto, crea cuatro copias usando el método clone() y modifícalas para llegar a tener cinco objetos (el inicial más los otros cuatro copias del original y luego modificados) cuyo contenido mostrarás por pantalla, debiendo obtener el siguiente resultado:
Citar
000000000000000000000000000000000000000000000000

111111111111000000000000000000000000000000000000

000000000000111111111111000000000000000000000000

000000000000000000000000111111111111000000000000

000000000000000000000000000000000000111111111111

Clase CadenaBinaria
Código: [Seleccionar]
public class CadenaBinaria implements Cloneable
{
    public String str1, str2, str3, str4;
 public CadenaBinaria(String a, String b, String c, String d) {this.str1=a; this.str2=b; this.str3=c; this.str4=d;}
      public CadenaBinaria clone()   {
      CadenaBinaria clon = new CadenaBinaria(this.str1, this.str2, this.str3, this.str4);
      return clon;
   }
 }

Clase principal Programa - main
Código: [Seleccionar]
/* Ejemplo Clase e Interfaz Cloneable aprenderaprogramar.com */
 public class Programa {
     public static void main(String arg[]) {
        CadenaBinaria c = new CadenaBinaria("000000000000","000000000000","000000000000","000000000000");
        CadenaBinaria c2 = c.clone();
        CadenaBinaria c3 = c.clone();
        CadenaBinaria c4 = c.clone();
        CadenaBinaria c5 = c.clone();
        c2.str1="111111111111";
        c3.str2="111111111111";
        c4.str3="111111111111";
        c5.str4="111111111111";
        System.out.println("Cadena binaria original :" + c.str1 + c.str2 + c.str3 + c.str4);
        System.out.println("Cadena binaria 2 (clon) :" + c2.str1 + c2.str2 + c2.str3 + c2.str4);
        System.out.println("Cadena binaria 3 (clon) :" + c3.str1 + c3.str2 + c3.str3 + c3.str4);
        System.out.println("Cadena binaria 4 (clon) :" + c4.str1 + c4.str2 + c4.str3 + c4.str4);
        System.out.println("Cadena binaria 5 (clon) :" + c5.str1 + c5.str2 + c5.str3 + c5.str4) ;
       }
 }

fmartinez25

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 7
    • Ver Perfil
Hola Luis M.

Creo que te ha faltado implementar un método en la clase CadenaBinaria para mostrar el resultado de concatenar sus atributos.

Paso a poner aquí mi propuesta de resolución del ejercicio:

Clase Cadenas
Código: [Seleccionar]
public class Cadenas implements Cloneable{
    private static final String CEROS="000000000000";
    private static final String UNOS="111111111111";

    private String cadena1, cadena2, cadena3, cadena4;   
   
    public Cadenas(String cadena1, String cadena2, String cadena3, String cadena4){
        this.cadena1=CEROS;
        this.cadena2=CEROS;
        this.cadena3=CEROS;
        this.cadena4=CEROS;
    }
   
    public String cambiarCadena(String cadena){
        if (cadena.equals(CEROS)){return UNOS;}else{return CEROS;}
    }
   
    public void cambiarCampo(int numeroDeCampo){
        switch(numeroDeCampo){
            case 1: this.cadena1=cambiarCadena(cadena1); break;
            case 2: this.cadena2=cambiarCadena(cadena2); break;
            case 3: this.cadena3=cambiarCadena(cadena3); break;
            case 4: this.cadena4=cambiarCadena(cadena4); break;
            default: break;
        }
    }
   
    public void imprimirCadenas(){
        System.out.println(cadena1+cadena2+cadena3+cadena4);
    }
   
    @Override
    public Cadenas clone(){
        Cadenas clon = new Cadenas(this.cadena1, this.cadena2, this.cadena3, this.cadena4);
        return clon;
    }
}

Clase con método main
Código: [Seleccionar]
public class CU00912C {

    public static void main(String[] args) {
        Cadenas objeto= new Cadenas("000000000000","000000000000","000000000000","000000000000");
        Cadenas copia1=objeto.clone();
        Cadenas copia2=objeto.clone();
        Cadenas copia3=objeto.clone();
        Cadenas copia4=objeto.clone();
       
        copia1.cambiarCampo(1);
        copia2.cambiarCampo(2);
        copia3.cambiarCampo(3);
        copia4.cambiarCampo(4);
       
        System.out.print("original: ");
        objeto.imprimirCadenas();
        System.out.print("copia1: ");
        copia1.imprimirCadenas();
        System.out.print("copia2: ");
        copia2.imprimirCadenas();
        System.out.print("copia3: ");
        copia3.imprimirCadenas();
        System.out.print("copia4: ");
        copia4.imprimirCadenas();
    }
   
}

Me gustaría que alguien me comentase cómo hacerlo de forma más eficiente y elegante.

Un saludo.

LuisM

  • Intermedio
  • ***
  • APR2.COM
  • Mensajes: 131
    • Ver Perfil
Hola fmartinez25 !!
Muchas gracias por tus comentarios sobre el ejercicio.
"Creo que te ha faltado implementar un método en la clase CadenaBinaria para mostrar el resultado de concatenar sus atributos."
Puede ser... aunque prefiero dejar la clase "Cadenas" (en tu ejemplo) o "Persona" (en el ejemplo) con sus atributos y el uso de la interface Cloneable, sin nada mas. Porque prefiero una clase que construya el objeto y otra que realice las operaciones sobre la misma.
Es lo que creo que definís como "elegante" y en mi humilde opinión es: fácil de entender y mantener !!. Ahora es muy sencillo, pero en casos complejos se nota la diferencia.
Un saludo,
Luis

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".