Stavo leggendo per eseguire correttamente una copia profonda di un array, tuttavia ero confuso su come è stato implementato lo #clone()
. Si tratta di un membro della classe java.lang.Object
, e tuttavia se si leggono le javadocs:Perché #clone() non è nell'interfaccia Cloneable?
In primo luogo, se la classe di questo oggetto non implementa l'interfaccia Cloneable, poi un CloneNotSupportedException è gettato.
Quindi perché definire il metodo clone
in primo luogo? Sicuramente se un metodo può essere utilizzato solo quando è presente un'interfaccia, devi inserire il metodo nell'interfaccia. L'interfaccia Cloneable
è vuota; è solo un'interfaccia marker utilizzata da Java per garantire che l'utilizzo del metodo clone
sia legale.
Facendo in questo modo rimuove anche la capacità di fare uso di farmaci generici al fine di garantire la sicurezza Tipo:
class Foo implements Cloneable { // Valid.
@Override
public Object clone() throws CloneNotSupportedException {
// ...
}
}
class TypeSafeFoo implements Cloneable<TypeSafeFoo> { // Not valid.
@Override
public TypeSafeFoo clone() throws CloneNotSupportedException {
// ...
}
}
Perché ha fatto Java in questo modo? Sono sicuro che hanno motivi legittimi, ma non riesco a capirlo.
In realtà questo era un difetto di progettazione come detto da Joshua Bloch –
Questo è uno dei tanti motivi per clonazione è considerato rotto. –