abstract + clone() = BUMM!

Status
Nicht offen für weitere Antworten.

Tobias

Top Contributor
*grummel*

Hi,

nur aus reiner Frustration: Ich habe einen ziemlich fetten Objektbaum, den ich ab und zu (zumindest teilweise) klonen muss. Ok, kein Problem, überschreibt man clone(), implementiert Cloneable, fügt ein bißchen eigene Logik hinzu - alles wird gut. Pustekuchen! Zur Laufzeit fliegt einem das ganze um die Ohren mit einem höchst aussagekräftigen "ClassFormatError: Code attributes in abstract method or interface in class file ..."-Error! Bißchen gegoogelt, das hier gefunden. Ok, Problem liegt in der clone()-Methode. Wenn die von einem Interface als
Code:
public MeineKlasse clone() throws CloneNotSupportedException
deklariert oder gar von einer abstrakten Klasse implementiert wird, passiert obige Katastrophe.

Ich bin begeistert.

Meine Fragen:
- Warum passiert das? Einfach ein Bug oder hat das einen Sinn, der sich mir noch nicht erschlossen hat?
- Und viel wichtiger: Was mache ich denn jetzt? Kopierkonstruktoren kommen nicht in Frage, ein Umbenennen der Methode wäre möglich, aber irgendwie blöd (ich will ja schönen Code abliefern ;)) ...

mpG
Tobias

*/grummel*
 
M

maki

Gast
kurz: Vergiss Clone und cloneable, beides Missgeburten.
Benutze lieber Copy-Konstruktoren oder statische factory Methoden, in deinem Falle wohl letzteres.

clone und cloneable sind kein schöner Code.
 

quippy

Bekanntes Mitglied
Tobias hat gesagt.:
Meine Fragen:
- Warum passiert das? Einfach ein Bug oder hat das einen Sinn, der sich mir noch nicht erschlossen hat?
- Und viel wichtiger: Was mache ich denn jetzt? Kopierkonstruktoren kommen nicht in Frage, ein Umbenennen der Methode wäre möglich, aber irgendwie blöd (ich will ja schönen Code abliefern ;)) ...

Frage a) von abstrakten Klassen kann man keine Instanz erzeugen. Wenn der Clone also in der abstrakten Klasse steckt, kann das nicht klappen! Daher gibt es auch keine Clone-Methode in Object die für alle ableitenden Objekte funktionieren würde.

Frage b) Copy-Constructors oder eine Methode "getCopyInstance" sind da besser. Das funktioniert auch dann mit der abstrakten Klasse in der Form

Code:
public abstract class A
{
   private int x;

   public abstract Object getCopyInstance();
   public void fillCopyInstance(A whatToFill)
   {
      // super.fillCopyInstance(whatToFill); // Gibt es hier nicht
      whatToFill.x = x;
   }
}

public class B extends A
{
   private int y;

   public Object getCopyInstance()
   {
      B result = new B();
      fillCopyInstance(result);
      return result;
   }
   public void fillCopyInstance(B whatToFill)
   {
      super.fillCopyInstance(whatToFill)
      whatToFill.y = y;
   }
}

so irgendwie... Aber das Konstruktorzeug fände ich da echt eleganter.

PS: statische Methoden würde ich in diesem Fall nicht verwenden, da die nicht überladbar sind. Da müßte man immer alle Copys der Oberklassen kopieren oder aber mit "B::A.getNewInstance" in die Oberklasse referenzieren. Wenn man dann mal Klassen umhängt, bricht gleich das Chaos los...
 

Tobias

Top Contributor
Ja, so gesehen macht das Sinn. Nur blöd, dass die Exception erst zur Laufzeit fliegt und nicht einfach schon der Compiler mosert. Ums Umbenennen der Methode werde ich wohl nicht herumkommen ...

mpG
Tobias
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Methoden abstract static Methode Allgemeine Java-Themen 8
L Vererbung Using @Autowired in Abstract Classes Allgemeine Java-Themen 4
T Interface vs abstract Allgemeine Java-Themen 2
S Klassen Abstract, Interface und ein Chat Tool Allgemeine Java-Themen 1
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
S Frage zu abstract Allgemeine Java-Themen 5
Bananabert Abstract ArrayList Allgemeine Java-Themen 4
T Interface > Abstract > Class Allgemeine Java-Themen 11
N Unterschied abstract interface und interface Allgemeine Java-Themen 4
R Vererbung mit Interface und Abstract Allgemeine Java-Themen 3
G Abstract class Stillfrage Allgemeine Java-Themen 4
H2SO3- abstract class mit Beispielen in abstracten Methoden Allgemeine Java-Themen 5
M abstract Methode aufrufbar? Allgemeine Java-Themen 3
O abstract, privat, Vererbung Allgemeine Java-Themen 29
M ist "public abstract class * extends" möglich? Allgemeine Java-Themen 2
T abstract - interface Unterschied Allgemeine Java-Themen 22
N Reflection: Feststellen ob eine Klasse abstract ist Allgemeine Java-Themen 3
B frage zu "file.renameTo()" bzw. abstract path allg Allgemeine Java-Themen 8
S static mit abstract und in interface Allgemeine Java-Themen 10
J Methoden clone(), arraycopy(): ein- und zweidimensionale Arrays Allgemeine Java-Themen 8
A deepcopy mit clone() Allgemeine Java-Themen 2
R Gleiche Objektreferenz trotz clone()? Allgemeine Java-Themen 12
P Unterschiedliche Clone- Methoden Allgemeine Java-Themen 5
H Frage zu clone() Allgemeine Java-Themen 5
xehpuk clone() wegen leerem Cloneable quasi nutzlos? Allgemeine Java-Themen 6
M Überschreiben der clone()-Methode Allgemeine Java-Themen 10
G Object mit clone kopieren Allgemeine Java-Themen 21
R Eigenes Objekt - clone() Allgemeine Java-Themen 2
V clone() ? Allgemeine Java-Themen 4
J immutable HashMaps und clone() Allgemeine Java-Themen 3
M Gibt es eigentlich einen Standalone-Java-ICQ-clone Allgemeine Java-Themen 19
M clone-methode nicht verfügbar Allgemeine Java-Themen 10
0 Keine clone-Methode für BigDecimal und BigInteger? Allgemeine Java-Themen 3
M Problem mit Generics und clone() Allgemeine Java-Themen 2
K The method clone() from the type Object is not visible. Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben