Quelle est la meilleure façon d'initialiser paresseusement une collection, je regarde spécifiquement Java. Je l'ai vu certaines personnes décident de le faire dans les méthodes de modification (qui semble un peu dégueu), comme suit:Initialisation par défaut d'une collection
public void addApple(final Apple apple) {
if (this.apples == null) {
apples = new LinkedList<Apple>();
}
this.apples.add(apple);
}
Vous pouvez factoriser l'initialisation en une méthode et l'appeler à partir d'ajout/suppression/mise à jour, etc. .. mais il semble un peu beurk. Il est souvent aggravé par le fait que les gens exposent également la collection elle-même via:
public Collection<Apple> getApples() {
return apples;
}
qui rompt l'encapsulation et conduit à des personnes accédant à la collection directement.
Le but de l'initialisation différée est purement lié aux performances.
Je suis curieux de voir ce que d'autres personnes proposent des approches pour cela. Des idées?
getApples() devrait probablement être 'final' ici. À tout le moins, le «self-use» non standard de getApples() devrait être clairement documenté pour donner aux sous-classes une chance de bien faire les choses. – erickson
@erickson si getApples() était définitif, cela signifierait que vous ne pouvez pas appeler getApples(). Add (apple), n'est-ce pas? Ou ai-je tort sur l'utilisation de la finale? –
Non, cela signifierait qu'une sous-classe ne pourrait pas remplacer la méthode. (Utilisez Collections.unmodifiableList pour une liste non modifiable.) –