La réponse courte à "pourquoi n'est pas Cloneable
obsolète?" (ou en fait, pourquoi n'est pas X
obsolète, pour tout le monde X
) est qu'il n'y a pas eu beaucoup d'attention portée à leur dépréciation.
La plupart des éléments qui ont été récemment obsolètes l'ont été, car il existe un plan spécifique pour les supprimer. Par exemple, les méthodes addPropertyChangeListener
et removePropertyChangeListener
de LogManager ont été déconseillées dans Java SE 8 avec l'intention de les supprimer dans Java SE 9. (La raison en est qu'elles compliquent inutilement les interdépendances de modules.) En effet, ces API ont déjà été supprimées du développement initial de JDK 9 . construit. (Notez que les appels d'écouteur de changement de propriété similaires ont également été supprimés Pack200
; voir JDK-8029806 .)
Aucun plan similaire n'existe pour pour Cloneable
et Object.clone()
.
Une réponse plus longue impliquerait de discuter d'autres questions, telles que ce que l'on pourrait s'attendre à ce qu'il arrive à ces API, quels coûts ou avantages la plate-forme gagnerait-elle si elles étaient obsolètes et ce qui est communiqué aux développeurs lorsqu'une API est obsolète. J'ai exploré ce sujet dans ma récente conférence JavaOne, Debt and Deprecation . (Diapositives disponibles sur ce lien; vidéo ici .) Il s'avère que le JDK lui-même n'a pas été très cohérent dans son utilisation de la dépréciation. Il a été utilisé pour signifier plusieurs choses différentes, y compris par exemple,
Ceci est dangereux et vous devriez être au courant des risques de son utilisation ( par exemple: Thread.stop()
, Thread.resume()
et Thread.suspend()
).
Cela va être supprimé dans une prochaine version
C'est obsolète et c'est une bonne idée pour vous d'utiliser quelque chose de différent (exemple: de nombreuses méthodes dans java.util.Date
)
Tous ces éléments ont des significations distinctes, et différents sous-ensembles d'entre eux s'appliquent à différentes choses qui sont obsolètes. Et certains sous-ensembles d'entre eux s'appliquent à des choses qui ne sont pas obsolètes (mais qui devraient peut-être être obsolètes).
Cloneable
et Object.clone()
sont «cassés» dans le sens où ils présentent des défauts de conception et sont difficiles à utiliser correctement. Cependant, clone()
c'est toujours le meilleur moyen de copier des tableaux, et le clonage a une utilité limitée pour faire des copies d'instances de classes qui sont soigneusement implémentées. La suppression du clonage serait un changement incompatible qui briserait beaucoup de choses. Une opération de clonage pourrait être réimplémentée d'une manière différente, mais elle serait probablement plus lente que Object.clone()
.
Cependant, pour la plupart des choses, un constructeur de copie est préférable au clonage. Alors peut-être que le marquage Cloneable
comme "obsolète" ou "remplacé" ou quelque chose de similaire serait approprié. Cela indiquerait aux développeurs qu'ils veulent probablement chercher ailleurs, mais cela ne signifierait pas que le mécanisme de clonage pourrait être supprimé dans une prochaine version. Malheureusement, un tel marqueur n'existe pas.
Dans l'état actuel des choses, la «dépréciation» semble impliquer une suppression éventuelle - malgré le fait qu'un nombre infime de fonctionnalités obsolètes ait jamais été supprimée - et la dépréciation ne semble donc pas justifiée pour le mécanisme de clonage. Peut-être qu'à l'avenir, un marquage alternatif pourra être appliqué qui incitera les développeurs à utiliser à la place des mécanismes alternatifs.
METTRE À JOUR
J'ai ajouté un historique supplémentaire au rapport de bogue . Frank Yellin, un des premiers implémenteurs de JVM et co-auteur de la spécification JVM, a fait quelques commentaires en réponse au commentaire "perdu dans la brume du temps" dans la recommandation TRC citée dans l' autre réponse . J'ai cité les parties pertinentes ici; le message complet se trouve dans le rapport de bogue.
Cloneable n'a pas de méthodes pour la même raison que Serializable n'en a pas. Cloneable indique une propriété de la classe, plutôt que de dire spécifiquement quoi que ce soit sur les méthodes prises en charge par la classe.
Avant la réflexion, nous avions besoin d'une méthode native pour faire une copie superficielle d'un objet. D'où Object.clone () est né. Il était également clair que de nombreuses classes voudraient remplacer cette méthode et que toutes les classes ne voudraient pas être clonées. Cloneable est donc né pour indiquer l'intention du programmeur.
Donc, en bref. Le but de Cloneable n'était pas d'indiquer que vous disposiez d'une méthode publique clone (). C'était pour indiquer que vous étiez prêt à être cloné en utilisant Object.clone (), et c'était à l'implémentation de décider de rendre public ou non clone ().