Java Cloneable interface

Tags:    java

Hej udvikleren

Jeg er ved at udvikle på et lille hobby projekt hvor jeg har brug for en helt traditionel træ struktur.

Jeg har derfor lavet en klasse Node og en klasse Tree. Surprise surprise :D

Problemet ligger i, at jeg gerne vil stille mig selv den garanti, at alle klasser der implementere mit Node interface også er cloneable. Jeg ved dog ikke hvordan dette kan realiseres.

Lige nu har jeg denne løsning, men det er jo slet ikke generelt (for ikke at nævne ret hacket med to casts, ugh), da det er i den implementerende klasse at jeg implementerer Cloneable interfacet.

Fold kodeboks ind/udJava kode 


Laver jeg interfacet om så det er
Fold kodeboks ind/udJava kode 


Giver det compile fejl hvis jeg laver noget ala:

Fold kodeboks ind/udJava kode 


Håber der sidder en java haj der ude, der kan hjælpe mig :)




4 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Nu er jeg godt nok ikke Java haj, koder faktisk aldrig i Java :). Men ville dit problem ikke løse sig, hvis du skrev:

Node clone();

Problemet er at som jeg læser dokumentationen så kræver interfacet Cloneable ikke at du implementere clone, men indikerer kun at man gør det.

Hvis du så skriver clone; I eget interface så kræver du at klasser implementerer clone.



Indlæg senest redigeret d. 02.04.2011 08:55 af Bruger #5620
Clonable interfacet har ingen members som person skriver. Jeg vil dog ikke anbefale du tilføjer clone() metoden til dit interface (den stammer fra java.lang.Object og er protected). I stedet bør du caste til den korrekte klasse:

Fold kodeboks ind/udJava kode 


Det yderste cast er der fordi clone() altid returnerer java.lang.Object.

Du bør derudover også gøre din overskrivning af clone() public. Læs evt.
http://stackoverflow.com/questions/1138769/why-is-the-clone-method-protected-in-java-lang-object



Indlæg senest redigeret d. 02.04.2011 11:42 af Bruger #6389
Din sidste sætning var lidt min pointe. Hvis det forventes at klasser implementerer clone public. Så kan man vel lige så godt kræve det ved at erklære det i interfacet?



Problemet er dog, at en modtager af et object af typen Node ikke nødvendigvis vil vide hvad klasse den modtager, så den kan ikke caste Node objektet til SimpleNode eller noget helt tredje.

Bevars, man kan bruge instanceof, men det kræver at man på compile time kender alle implementerende typer.

Tror min løsning må blive, at lave mit eget 'cloning' interface der blot indeholder en clone metode og så vil jeg ikke tænke på nedarvning, det er også noget møj anyway :)

Tak for svarene



t