Question

Je me rends compte que je vais faire incendier pour ne pas écrire simplement moi-même épreuve ... mais je suis curieux de savoir l'opinion des gens, pas seulement la fonctionnalité, donc ... va ici ...

J'ai une classe qui a une liste privée. Je veux ajouter à cette liste privée par la méthode getMyList publique ().

... cela fonctionnera?

public class ObA{
 private List<String> foo;
public List<String> getFoo(){return foo;}
}

public class ObB{
   public void dealWithObAFoo(ObA obA){
     obA.getFoo().add("hello");

   }
}
Était-ce utile?

La solution

Oui, cela fonctionnera tout à fait - ce qui est généralement une mauvaise chose. (Ceci est parce que vous êtes vraiment un retour référence à l'objet de collection, pas une copie de la collection elle-même.)

Très souvent, vous voulez fournir véritablement l'accès en lecture seule à une collection, ce qui signifie généralement retourner une enveloppe en lecture seule autour de la collection. Faire le type de retour d'une interface de lecture seule mis en œuvre par la collecte et le retour de la référence de collecte effective ne fournit pas beaucoup de protection: l'appelant peut facilement jeter le type de collection « réel », puis ajouter sans aucun problème.

Autres conseils

En effet, pas une bonne idée. Ne publiez pas vos membres mutables à l'extérieur, faites une copie si vous ne pouvez pas fournir une lecture seule version à la volée ...

public class ObA{
  private List<String> foo;
  public List<String> getFoo(){return Collections.unmodifiableList(foo);}
  public void addString(String value) { foo.add(value); }
}

Si vous voulez une opinion à faire cela, je retire l'appel getFoo() et ajouter une méthodes de add(String msg) et remove(String msg) (ou tout autre fonctionnalité que vous voulez exposer) à Oba

Donner accès à la collection semble toujours être une mauvaise chose dans mon expérience - surtout parce qu'ils sont pratiquement impossibles à contrôler une fois qu'ils sortent. J'ai pris l'habitude de ne jamais permettre un accès direct aux collections en dehors de la classe qui les contient.

Le principal raisonnement derrière cela est qu'il ya presque toujours une sorte de logique métier attaché à la collecte de données - par exemple, validation plus ou peut-être un jour, vous aurez besoin d'ajouter une deuxième collection étroitement liée.

Si vous autorisez l'accès comme vous parlez, il sera très difficile à l'avenir de faire une modification comme celui-ci.

Oh, je trouve aussi souvent que j'ai finalement de stocker un peu plus de données avec l'objet que je suis le stockage - donc je crée un nouvel objet (connu seulement à l'intérieur du « conteneur » qui abrite la collection) et je mettre l'objet à l'intérieur, avant de le mettre dans la collection.

Si vous avez gardé votre collection verrouillé, c'est un refactoring trivial. Essayez d'imaginer comment il serait difficile dans certains cas, vous avez travaillé sur l'endroit où vous ne l'avez pas gardé la collection verrouillé ...

Si vous voulez soutenir ajouter et supprimer des fonctions Foo, je suggère les méthodes addFoo () et removeFoo (). Je vous pouvais idéalement éliminer à l'ensemble getFoo en créant une méthode pour chaque morceau de fonctionnalité dont vous avez besoin. Cela rend clair que les fonctions d'un appelant préforme sur la liste.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top