Pourquoi ne pas le support de Java un constructeur de copie comme en C++?
Réponses
Trop de publicités?Java n'. Ils sont tout simplement pas appelé implicitement comme ils sont en C++ et je pense que c'est votre vraie question.
Tout d'abord, un constructeur de copie n'est rien de plus que:
public class Blah {
private int foo;
public Blah() { } // public no-args constructor
public Blah(Blah b) { foo = b.foo; } // copy constructor
}
Maintenant C++ implicitement appeler le constructeur de copie avec une déclaration comme ceci:
Blah b2 = b1;
Le clonage et de la copie dans l'instance en fait tout simplement pas de sens en Java, car tous les b1 et b2 sont des références et non des objets de valeur comme ils sont en C++. En C++, cet état fait une copie de l'état de l'objet. En Java, il copie simplement la référence. L'état de l'objet n'est pas copié donc implicitement d'appeler le constructeur de copie n'a pas de sens.
Et c'est tout là est à lui vraiment.
De Bruce Eckel:
Pourquoi est-ce que [un constructeur de copie] en C++ et pas Java?
Le constructeur de copie est fondamental une partie de C++, car il automatiquement fait une copie locale d'un objet. Encore l'exemple ci-dessus prouve qu'il n' pas de travail pour Java. Pourquoi? En Java tout ce que nous manipuler est un poignée, alors qu'en C++, vous pouvez avoir poignée entités comme et vous pouvez également passer directement les objets. C'est ce que le C++ constructeur de copie : quand vous souhaitez prendre un de l'objet et de le transmettre par valeur, donc la duplication de l'objet. De sorte qu'il fonctionne amende en C++, mais vous devez garder à l'esprit que ce régime ne parvient pas en Java, donc ne l'utilisez pas.
(Je recommande la lecture de l'intégralité de la page -- en fait, commencer ici à la place.)
Je pense que la réponse à cette question est très intéressante.
Pour l'un, je crois qu'en Java, tous les objets sont sur le tas, et alors que vous n'avez pas de pointeurs, vous avez des "Références". Les références ont copie symantics et java interne assure le suivi des comptes de référence de sorte que son garbage collector sait ce qui est sûr de se débarrasser de.
Depuis que vous avez seulement accès à des objets à travers copiable références, le nombre de fois où vous avez besoin de copier un objet est considérablement réduite (par exemple, en C++, il suffit de passer un objet à une fonction (en valeur) des résultats de nouveaux objets en cours de copie construit, en Java, seule la référence à l'objet est passé). Les concepteurs ont probablement pensé que clone() suffit pour les autres utilisations.
C'est juste mon avis (je suis sûr qu'il n'y est une réponse justifiable)
Copie des constructeurs en C++ sont principalement utile lorsque vous envoyez ou renvoyer des instances de classes en valeur, étant donné que c'est quand le constructeur de copie est activé de manière transparente.
Depuis en Java tout est retourné par référence, et le VM est axée sur l'allocation dynamique, il n'y pas vraiment une justification de la complexité d'un constructeur de copie.
En outre, puisque tout est par référence, un développeur souvent à fournir leur propre mise en œuvre et de la décision sur la façon de cloner.