11
votes

Si vous ne clonez pas en Java, que faites-vous et que l'appelez-vous?

Quelqu'un a-t-il des pratiques suggérées ou établies des meilleures pratiques et des conventions de nommage pour les constructeurs de copies / méthodes d'usine, etc. en Java? En particulier, disons que j'ai une classe chose et je veux une méthode quelque part qui renvoie un nouveau chose avec la même valeur qu'un chose transmis (ou comme l'instance s'il s'agit d'une méthode d'instance). Auriez-vous cela comme constructeur ou une méthode statique d'usine ou une méthode d'instance? Que l'appelleriez-vous?

Selon le titre, je veux éviter clone () et clonable .


3 commentaires

Pourquoi voulez-vous éviter le clonage () et clonable?


@Thomas Owens, voir ici: Artima.com/intv/bloch13.html


Pour les réponses que le constructeur de copie d'état en tant que solution: Copier Constructor ne gère pas correctement tous les cas. Par exemple, lorsque vous ne connaissez pas la classe de béton (mais vous pouvez toujours utiliser le constructeur de copie à l'intérieur de votre méthode Clone / Copy / WhateTouthaCallit).


8 Réponses :


0
votes

Vous pouvez écraser le clone () -method, si vous voulez. Une autre pratique utilisée est un constructeur qui prend un objet de ce type, c'est-à-dire Nouvelle ArrayList (une autreList) .


0 commentaires

3
votes

Je l'appellerais une méthode de copie ou un constructeur de copie (selon le cas). Si c'était une méthode statique, alors je l'appellerais une usine.

En termes de quoi faire, l'option la plus flexible et la plus longue du vie est un constructeur de copie. Cela donne aux sous-classes la capacité de se copier comme le parent.


0 commentaires

2
votes

Je ferais un constructeur xxx

puis lorsque vous voulez le cloner xxx


0 commentaires

0
votes

Vous avez quelques options, implémentez clonable , ajoutez un constructeur de copie mais ma manière préférée est d'utiliser une méthode (statique ou instance) qui a un nom qui est descriptif de la copie de la copie L'opération fait - est-ce une copie profonde ou peu profonde, etc.


0 commentaires

16
votes

Java efficace recommande l'un des éléments suivants:

  1. Un constructeur de copie (comme indiqué par d'autres personnes):

    élément public (élément d'élément)

  2. une méthode d'usine de copie:

    Objet statique public NewInstance (article)

    (aussi, pas de copie pour immutables)

    La principale différence est que, avec # 1, vous choisissez la classe actuelle du résultat, et avec # 2, la mise en œuvre peut renvoyer une sous-classe. La sémantique de la classe peut vous guider dans laquelle une meilleure est la meilleure.


0 commentaires

0
votes

Utilisez structures de données immuables . La seule raison pour laquelle vous avez besoin que vous avez besoin clone () est que vous militant vos objets en place. Arrêter de faire ça. Pensez à la façon dont vous pouvez:

  • Faites vos cours finales.
  • Faites des champs de vos classes finales et privées.

    par exemple, voici un "setter" pour un objet vectoriel 3D immuable: xxx

    donc je suppose ce que je dis c'est ... je Utilisez des constructeurs de copies au lieu de mutation et je les nommez simplement en fonction de l'attribut que je veux modifier.


0 commentaires

0
votes

Une autre option consiste à implémenter la méthode de copie dans l'objet source , par exemple: xxx

vous implémenteriez ensuite copier avec un morceau de code comme: xxx

Ceci peut être utile si:

  • Il n'a pas de sens de cloner tout l'objet
  • Il existe un groupe de propriétés associées qui sont souvent copiées comme une unité
  • Vous ne souhaitez pas exposer loc en tant que propriété de chose
  • Le nombre de propriétés est grand (ou il existe de nombreux groupes), donc un constructeur qui nécessitait tous les paramètres.

0 commentaires

0
votes

Ce n'est pas la meilleure approche de la copie d'objets, mais ce qui suit est parfois utile si vous souhaitez effectuer une copie une copie profonde forte> d'un objet em> em> séralisable. Cela évite d'avoir à écrire des conducteurs de copie, de mettre en œuvre des classes d'usine claquant ou d'écriture.

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);

//Serializes the input object
oos.writeObject(input);

ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);

//Copy of the input object
Object output = ois.readObject();


0 commentaires