Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: LuisM en 16 de Noviembre 2017, 13:32

Título: Interface Cloneable y método clone del API Java. Cómo duplicar objetos CU00912C
Publicado por: LuisM en 16 de Noviembre 2017, 13:32
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) ;
       }
 }
Título: Re:Interface Cloneable y método clone del API Java. Cómo duplicar objetos CU00912C
Publicado por: fmartinez25 en 27 de Noviembre 2017, 09:53
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.
Título: Re:Interface Cloneable y método clone del API Java. Cómo duplicar objetos CU00912C
Publicado por: LuisM en 27 de Noviembre 2017, 14:09
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