Java de la méthode add() de la convention de
Donc, je suis normalement un programmeur ruby, donc ma prise de conventions Java est fragile, au mieux. Si j'ai une classe A et souhaitez définir une méthode pour ajouter deux instances de cette classe, ce qui est la convention sur le comportement et le type de retour?
public class A
{
//...
public NotSureWhatTypeItShouldReturn add (A that) { /* ... */ }
Dois-Je
- retourner un booléen indiquant la réussite et de modifier la cible, ou
- retour une copie modifiée de la cible et de lever une exception en cas d'erreur
Ce qui correspond à la Java normal convention pour ce genre de méthode?
Votre question implique que la classe contenant la 'ajouter' est une méthode de collecte, mais ce n'est probablement pas le cas pouvez-vous préciser?
En réalité, c'est une mise en œuvre de
De la manière dont les OP libellé de la question, et l'extrait de code montré, je crois que nous ne traitons pas avec des collections, mais plutôt quelque chose comme BigDecimal où vous pouvez ajouter une instance à l'autre.
Je mispoke,
bon appel sur
En réalité, c'est une mise en œuvre de
Iterable
. Le traiter comme un Collection
ne semble pas faire sens (puisque je ne veux pas ajouter des membres individuels), mais je ne veux pas la capacité de combiner les deux instances dans un seul Iterable
qui va se répéter sur tous les membres de chaque.De la manière dont les OP libellé de la question, et l'extrait de code montré, je crois que nous ne traitons pas avec des collections, mais plutôt quelque chose comme BigDecimal où vous pouvez ajouter une instance à l'autre.
Je mispoke,
Iterable
est seulement l'une des deux situations dans lesquelles je vais utiliser cette - je vais aussi faire l'addition vectorielle pour une autre classe, par exemple,[1 2 3] + [4 -1 0] = [5 1 3]
.bon appel sur
concatenate
. Je pense que je vais voler plus
de Jon Skeet de réponse pour mon cas d'addition de vecteurs.OriginalL'auteur rampion | 2010-06-18
Vous devez vous connecter pour publier un commentaire.
Tout le monde ici est de penser à des Collections.ajouter()-type de méthode; mais je doute que c'est ce que vous pensez. Êtes-vous plus dans la ligne de, disons,
Vector2D.add()
qui ajoute le x et y de la composante de la Vector2D ensemble?En Java, aussi loin que je peux dire, Collections généralement modifier eux-mêmes (et donc ne les Collections.ajouter).
Cependant, la non-Collections d'objets (par exemple, Vector2D) varie plus. Parmi les conventions que j'ai vu:
Cls add(Cls b)
qui renvoie un nouvel objet et de ne pas modifier les instances existantesvoid add(Cls b)
qui modifiethis
et ne renvoie rien (c'est à dire de type void), il ne doit pas modifierb
. Il n'y a pas de point de retourbool
puisque ce type d'ajout est jamais censé à l'échec (et si ce n'est de toute façon, une Exception serait le cas).Cls add(Cls a, Cls b)
qui renvoie un nouvel objet, modifie ni a, ni b. Cls.add() est une méthode statique dans la classe Cls.Personnellement, je préfère le premier style de l'arithmétique de style add(); c'est précisément parce que nous pouvons faire.ajouter(b).ajouter(c).ajouter(d) qui ressemble un peu à "a + b + c + d". (Je ne devrais pas faire cela si
a
est une Collection; puisque la série plus un peu bizarre pour les Collections d'objets.)OriginalL'auteur Lie Ryan
Les deux existent:
de la Collection.ajouter
modifie la collecte et renvoie un booléen, etBigInteger.ajouter
retourne une nouvelleBigInteger
qui détient la somme de l'original et le passé-en instance.Je généralement s'attendre à la plupart des méthodes pour modifier l'instance qu'ils sont appelés sur la, plutôt que de retourner un objet de même type, mais si il y a un bon cas d'utilisation pour garder les instances const et de renvoyer une nouvelle instance à tout moment, vous pouvez certainement le faire
OriginalL'auteur Michael Mrozek
Ne pas retourner un booléen sauf si c'est un "échec attendu" par exemple, essayez d'ajouter à un ensemble. Si quelque chose va effectivement mal, lance une exception.
Maintenant, vous pourrait retour une copie modifiée ou vous pouvez ajouter de l'objet existant. L'immuabilité est souvent une belle propriété... mais la plupart des collections en Java sont mutables. Si vous allez en bas de la immuables de l'itinéraire que vous pourriez vouloir envisager à l'aide de
plus
au lieu deadd
- il donne plus d'un sentiment de "il y a un résultat, vous devriez regarder, et je ne vais pas changer de cible" de l'OMI.OriginalL'auteur Jon Skeet
Je recommanderais le même comportement que dans Collection.ajouter, c'est ce à quoi je m'attends.
OriginalL'auteur stacker
De la Java Les Collections de l'API:
OriginalL'auteur MikeD
Ceci n'est pas une convention, mais seulement ce que
boolean Collection<E>.ajouter(E)
illustre:Méthodes de la Java des Collections de classes du Framework rarement renvoie la collection qu'ils sont invoqués lors de l'. C'est, il n'est pas idiomatiques à l'appui de cette:
Certaines classes dans les bibliothèques Java employer le "fluide" de style, par exemple
Appendable
commeStringBuilder
, mais aucune des principales Collections Java les classes du Framework faire.OriginalL'auteur polygenelubricants
Dépend de la sémantique de votre classe, mais en général, ce serait:
Si ce que vous avez l'intention est seulement d'agréger les éléments.
Vous pouvez utiliser:
Si votre intention est de savoir si la structure a été modifiée ou n'est pas ( Comme avec un
java.util.Set
ou des collections en général )Et vous pouvez utiliser
public A add( A that ){}
si votre intention est de créer un "constructeur comme" objet ( commeStringBuilder.append
méthode.Donc, en fonction de la sémantique de votre classe que vous pourriez utiliser.
La plupart du temps (+de 90%) je ne la première:
void add( A other ){}
OriginalL'auteur OscarRyz