tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
1003
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Wenn ich eine Klasse myClass habe, die das Interface Cloneable implementiert, kann ich dann einen Copy-Konstruktor folgendermaßen schreiben?
    Code java:
    1
    2
    
    public myClass (myClass m)
    { this = (myClass)m.clone(); }
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  2. #2
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.806
    Blog-Einträge
    5
    Hallo,

    das wird so nicht klappen. this ist keine Variable, deshalb darf es nicht auf der linken Seite einer Zuweisung auftreten.

    Grüße,
    Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  3. #3
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Ist es denn überhaupt üblich, bzw. sinnvoll, einen Copy-Konstruktor zu implementieren? Eigentlich ist er redundant, wenn es eine passende clone()-Methode gibt.
    Und warum muss clone() immer Object zurückgeben?
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  4. #4
    Avatar von Vincentius
    Vincentius Vincentius ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Ort
    Stuttgart
    Beiträge
    295
    Hallo,

    ich würde statt dem Konstruktor eine statische Factory-Methode verwenden:

    Code java:
    1
    2
    3
    4
    5
    
    public static MyClass clone( MyClass source ) throws CloneNotSupportedException
    {
      MyClass clone = ( MyClass ) source.clone();
      return clone;
    }

    Grüße
    Vincent
     
    "Any sufficiently advanced technology is indistinguishable from magic." Arthur C. Clarke.

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Vincentius Beitrag anzeigen
    Hallo,

    ich würde statt dem Konstruktor eine statische Factory-Methode verwenden:

    Code java:
    1
    2
    3
    4
    5
    
    public static MyClass clone( MyClass source ) throws CloneNotSupportedException
    {
      MyClass clone = ( MyClass ) source.clone();
      return clone;
    }
    Wozu sollte das gut sein? Um dann
    Code java:
    1
    
    MyClass b = MyClass.clone(b);
    statt einfach nur:
    Code java:
    1
    
    MyClass b = a.clone();
    schreiben zu können? Find ich nicht sinnvoll.

    Ein Kopierkonstruktor ist in Java nicht üblich. Diesem Konstruktor kommt ja auch keine besondere Bedeutung (wie z.B. in C++) zu.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Wenn ich mich recht erinnere hat der Prof in der Vorlesung gesagt, man sollte möglichst immer einen Kopierkonstruktor schreiben. Wenn man dann noch eine clone() Methode will, besteht der Rumpf der Methode nur aus "return new MyClass(original);"
     

  7. #7
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Es gibt ja schon einige vorgefertigte Klassen mit Copykonstructoren. (Denke ich, habe ich noch nie verwendet.)
    z. B. Font, also unüblich ist es wohl eher nicht.

    Aber warum drehst du es nicht einfach um?
    Also statt dass du in clone die Variablen überträgst, und es im Constructor aufrufst, übertrage doch im Constructor die Variablen auf das neue Objekt und rufe in clone beim erzeugen dieses den Konstructor auf.
     
    Mein kleiner webstart Projektplaner:
    http://178.77.101.236/ppws/
    Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.

    Danke. :)

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Kai008 Beitrag anzeigen
    Es gibt ja schon einige vorgefertigte Klassen mit Copykonstructoren. (Denke ich, habe ich noch nie verwendet.)
    z. B. Font, also unüblich ist es wohl eher nicht.
    Du hast recht. Siehe z.B. http://www.javapractices.com/topic/TopicAction.do?Id=12

    Man sollte wohl die clone Methode lieber in Ruhe lassen: http://www.javapractices.com/topic/TopicAction.do?Id=71

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    Avatar von Vincentius
    Vincentius Vincentius ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Ort
    Stuttgart
    Beiträge
    295
    Zitat Zitat von deepthroat Beitrag anzeigen
    Hi.
    Wozu sollte das gut sein?
    Das könnte schon sinnvoll sein, um dort z.B. das Exception-Handling einzubauen, die source-Instanz auf null zu prüfen, eventuell um bestimmte Felder der source-Instanz ebenfalls durch eine clone() Methode zu kopieren. Man kann sich auch vorstellen, einige Felder wieder auf default-Wert zu setzen. Das kommt immer auf die konkrete Implementierung an. Mit einer Factory-Metzode vermeidet man redundanten Code.

    Grüße
    Vincent
     
    "Any sufficiently advanced technology is indistinguishable from magic." Arthur C. Clarke.

  10. #10
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Zitat Zitat von CPoly Beitrag anzeigen
    Wenn ich mich recht erinnere hat der Prof in der Vorlesung gesagt, man sollte möglichst immer einen Kopierkonstruktor schreiben. Wenn man dann noch eine clone() Methode will, besteht der Rumpf der Methode nur aus "return new MyClass(original);"
    Dies war auch der Ansatz, den ich intuitiv verfolgt habe (mir war gar nicht bewusst, wie viele Gründe es noch gibt, diese Vorgehensweise zu wählen). Ich dachte aber, ich könnte das shallow copy nutzen, um mir das Kopieren von Variablen primitiver Datentypen zu ersparen, wenn ich die Vorgehensweise umkehre. Es wird übrigens empfohlen, den Copy-Konstruktor als protected zu deklarieren. Eine genauere Diskussion zu dem Thema habe ich in Why Copying an Object is a terrible thing to do? gefunden. Dort wird übrigens auch erklärt, warum es sinnvoll ist, clone() weiterhin zu unterstützen.
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 27.12.07, 16:08
  2. Konstruktor überschreiben in VB6.0... wie?!
    Von CoderChris im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 17.09.07, 10:36
  3. Zeiger an Konstruktor übergeben
    Von LukeS im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 31.07.07, 14:02
  4. Copy-Konstruktor
    Von squeaker im Forum Delphi, Kylix, Pascal
    Antworten: 1
    Letzter Beitrag: 25.09.06, 14:33
  5. Zeiger auf Zeiger nicht verstanden
    Von Razorhawk im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 17.10.05, 12:24