posso aggiungere a una lista privata direttamente attraverso il getter?

StackOverflow https://stackoverflow.com/questions/895257

  •  23-08-2019
  •  | 
  •  

Domanda

Mi rendo conto che sto andando ottenere fiammato per non aver semplicemente scrivendo una prova me stesso ... ma io sono curioso di sapere le opinioni della gente, non solo la funzionalità, così ... qui va ...

Ho una classe che ha una lista privata. Voglio aggiungere a quella lista privata attraverso il metodo getMyList pubblico ().

così ... sarà questo lavoro?

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");

   }
}
È stato utile?

Soluzione

Sì, che sarà assolutamente funziona - che di solito è una cosa negativa. (Questo è perché si sta davvero tornando a di riferimento per l'oggetto insieme, non una copia della collezione stessa.)

Molto spesso si desidera fornire veramente accesso in sola lettura a una collezione, che di solito significa la restituzione di un involucro di sola lettura intorno alla collezione. Fare digitare il ritorno di un'interfaccia di sola lettura attuata dalla raccolta e restituendo il riferimento collezione reale non offre molta protezione: il chiamante può facilmente lanciare al tipo di raccolta "reale" e quindi aggiungere senza problemi.

Altri suggerimenti

In effetti, non è una buona idea. Non pubblicare i vostri membri mutevoli di fuori, fare una copia, se non è possibile fornire una versione di sola lettura al volo ...

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

Se si desidera un parere su questa operazione, mi tolgo la chiamata getFoo() e aggiungi un add(String msg) e remove(String msg) metodi (o qualunque altra funzionalità che voglio esporre) per Oba

che dà accesso alla raccolta sembra sempre di essere una cosa negativa nella mia esperienza - soprattutto perché sono praticamente impossibile da controllare, una volta che escono. Ho preso l'abitudine di consentire MAI accesso diretto alle collezioni al di fuori della classe che li contiene.

La motivazione principale alla base di questo è che c'è quasi sempre una sorta di logica di business attaccato alla raccolta di dati - per esempio, la convalida in aggiunta o forse un giorno sarà necessario aggiungere una seconda raccolta strettamente legati.

Se si consente l'accesso come si sta parlando, sarà molto difficile in futuro per fare una modifica del genere.

Oh, inoltre, ho spesso che alla fine ho dovuto memorizzare un po 'più di dati con l'oggetto che sto memorizzazione - in modo da creare un nuovo oggetto (conosciuto solo all'interno del "contenitore" che ospita la collezione) ed io mettere l'oggetto all'interno che prima di metterlo nella collezione.

Se hai mantenuto la tua collezione bloccato, questo è un refactoring banale. Provate a immaginare quanto difficile sarebbe in qualche caso in cui hai lavorato dove non hai mantenere la collezione bloccato ...

Se si voleva sostenere aggiungere e rimuovere le funzioni di Foo, vorrei suggerire i metodi di addFoo () e removeFoo (). Ho idealmente si potrebbe eliminare il getFoo a insieme con la creazione di un metodo per ogni pezzo di funzionalità necessarie. Questo mettere in chiaro per quanto riguarda le funzioni di un chiamante preforma sulla lista.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top