# Wie kann man ein Objekt kopieren?



## TomatenBrot447 (25. Jan 2017)

Hallo
Ich habe eine Klasse namens Isogon.
Und in der Aufgabe steht dass die Methode so aussehen muss:

 public Isogon kopiere(){

    }

Und diese Methode soll nun zuende geschrieben werden. 
Aufgabe : "*Die Methode kopiere soll eine Kopie des Isogons als neues Objekt zurückgeben. Sie müssen demnach in der Methode ein neues Objekt vom Typ Isogon erzeugen mit identischen Eigenschaften.*"

Mir begegnet sowas zum ersten Mal. Wie kann man in einer Methode ein Objekt kopieren???


----------



## JCODA (25. Jan 2017)

irgendwo muss new Isogen(...) aufrufen werden je nachdem, welche Konstruktoren es gibt. Entweder werden alle Attribute per Konstruktor übergeben oder dann entsprechend gesetzt.


----------



## Jardcore (26. Jan 2017)

Du musst dafür erstmal wissen was dein Isogon ausmacht.
Ein Objektzustand wird immer von seinen Attributen bestimmt.
Eine Kopie erzeugst du also, wenn du eine neue Instanz der Klasse Isogon erstellst und in diesem Objekt die gleichen Attribute deines ursprünglichen Objektes setzt.

Zum Beispiel:

```
public class Haus {
    private Color farbe;

    public Color getFarbe() { return farbe; }
    public void setFarbe(Color farbe) { this.farbe = farbe;}

    public Haus kopiere() {
        Haus kopie = new Haus();
        kopie.setFarbe(this.getFarbe());
        return kopie;
    }
}
```


```
public class KopieSample {
    public static void main(String[] args) {
        Haus orginal = new Haus();
        original.setFarbe(Color.GREEN);

        Haus kopie = original.kopiere();
    }
}
```


----------



## Wirago (26. Jan 2017)

Einfach einen Kopierkonstruktor erstellen:


```
class Class1 {
  private int temp;
  private String text;

  public Class1(Class1 sourceObject)
  {
      this.temp = sourceObject.temp;
      this.text = sourceObject.text;
  }
}
```


----------



## Jardcore (30. Jan 2017)

Wirago hat gesagt.:


> class Class1 {
> private int temp;
> private String text;
> 
> ...



Dann bitte die Getter nicht vergessen.
Die Benutzung eines CopyConstructors ist nicht sehr clean.
Der Vorteil einer kopiere() / copy() Methode ist es, das du anhand des Namens sofort weißt was gemacht wird


----------



## artchi (6. Feb 2017)

Der Copy-Ctor ist bei C++ ein Sprach- und Compiler-Feature. Unter Java ist er das nicht, ich würde dieses Idiom deshalb nicht auf Java übertragen.
Es hat auch den Nachteil, das es mit Polymorphy schlecht funktioniert. Weil dann nicht zwangsweise der richtige Copy-Ctor aufgerufen wird, da es ja keine Ctors mit Latebinding gibt. Ich müsste ja erstmal den Typ raus finden. Lasse mich aber gerne eines besseren belehren.
Wenn ich aber eine Copy-Methode aufrufe, ist das per Latebinding, da muss ich als Aufrufer nichts über den genauen Typ wissen.


----------



## Xyz1 (6. Feb 2017)

Bitte Klassen nicht ClassX nennen. Seht euch doch mal ein paar offizielle Beispiele an.

Flach????
Dann so:

```
/**
 * @author
 */
public class Isogon implements Cloneable {

    String s1;
    String s2;

    public static void main(String[] args) throws CloneNotSupportedException {
        Isogon i1 = new Isogon(Math.random() + "", Math.random() + "");
        Isogon i2 = i1.kopiere();
        // just for debug Purposes...
        System.out.println(i1 == i2);
        System.out.println(i1.s1 == i2.s2);
        System.out.println(i1.s2 == i2.s2);
    }

    public Isogon(String s1, String s2) {
        this.s1 = s1;
        this.s2 = s2;
    }

    public Isogon kopiere() throws CloneNotSupportedException {
        return (Isogon) this.clone();
    }
}
```

WIE LAUTET DIE AUSGABE?

BTW beliebte Prüfungsfrage


----------



## thecain (6. Feb 2017)

DerWissende hat gesagt.:


> WIE LAUTET DIE AUSGABE?


Warum kopiere und nicht clone()?


----------



## JStein52 (6. Feb 2017)

DerWissende hat gesagt.:


> WIE LAUTET DIE AUSGABE?


Und wie lautet sie ? Und warum brauchst du noch die Methode kopiere ? Du kannst doch gleich i1.clone() schreiben

Edit: ja, gleiche Frage


----------



## Xyz1 (6. Feb 2017)

thecain hat gesagt.:


> Warum kopiere und nicht clone()?


Also bitte:


> Und in der Aufgabe steht dass die Methode so aussehen muss:
> public Isogon kopiere(){
> }


ich hab mich nur an die Aufgabenstellung gehalten.

Ausgabe... von heute Nachmittag... wenn ich mich noch recht erinnere...
false
false
true

Das Unterschied einer flachen Kopie. Im Englischen: Shallow

Für eine Nicht-Flache-Kopie müsste er sich jetzt etwas ausdenken. Ich sag auch nicht, wie heißt. Das Beispiel ist weiter aber schlecht gewählt, mit Strings, unveränderlich.


----------



## Jardcore (7. Feb 2017)

DerWissende hat gesagt.:


> *public* Isogon kopiere() *throws* CloneNotSupportedException {
> *return* (Isogon) *this*.clone();
> }



Gewöhne dir am besten an das casten wie folgt zu machen.

```
Isogon.class.cast(this.clone());
```
Sonst wirst du bei großen Projekten mit vielen Generics irgendwann mit Warnungen überhäuft werden.


----------



## Xyz1 (7. Feb 2017)

Ich wollte nur darauf aufmerksam machen,
dass es wichtig ist, WIE alle Attribute kopiert werden.
Also
[x] neues Objekt
[ ] neue Attribute
[x] der gleiche Inhalt
[x] derselbe Inhalt
usw.

DAS stand aber nicht in der Aufgabenstellung, deshalb ich `.clone()` nicht pauschal als falsch bewerten.

Außerdem Attribut vielleicht eine Liste an Objekte... Nicht nur die Liste neu erstellen? Auch die Objekte neu erstellen? Das alles mit schreiben.


----------

