kann ich direkt durch den Getter zu einer privaten Liste hinzufügen?

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

  •  23-08-2019
  •  | 
  •  

Frage

Ich weiß, ich werde ein Test für die nicht einfach zu schreiben mich geflammt bekommen ... aber ich bin gespannt auf die Meinung der Menschen, nicht nur die Funktionalität, so ... hier geht ...

Ich habe eine Klasse, die eine private Liste. Ich möchte, dass die privaten Liste über das öffentliche getMyList () -Methode hinzuzufügen.

so ... wird diese Arbeit?

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

   }
}
War es hilfreich?

Lösung

Ja, das ist absolut arbeiten - das ist in der Regel eine schlechte Sache. (Dies ist, weil Sie wirklich einen Hinweis zum Sammelobjekt zurückkehren, nicht eine Kopie der Sammlung selbst.)

Sehr oft wollen Sie wirklich nur lesenden Zugriff auf eine Sammlung schaffen, die in der Regel bedeutet einen Nur-Lese-Wrapper um die Sammlung zurück. die Rückkehr zu machen, eine schreibgeschützte durch die Sammlung implementierte Schnittstelle eingeben und die tatsächliche Sammlung Referenz Rückkehr bieten nicht viel Schutz: Der Anrufer kann auf die „echten“ Kollektionstyp leicht gegossen und dann ohne Probleme hinzufügen.

Andere Tipps

Ja, keine gute Idee. Sie nicht veröffentlichen Sie Ihre wandelbar Mitglieder außerhalb, eine Kopie erstellen, wenn Sie nicht eine schreibgeschützte Version on the fly bieten kann ...

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

Wenn Sie eine Meinung über das tun dies wollen, würde ich den getFoo() Anruf entfernen und eine add(String msg) und remove(String msg) Methoden hinzufügen (oder was auch immer andere Funktionen möchten Sie belichten) Oba

, der Zugang zu Sammlung scheint immer eine schlechte Sache in meiner Erfahrung zu sein - vor allem, weil sie so gut wie unmöglich zu kontrollieren, wenn sie aussteigen. Ich habe auf die Gewohnheit genommen von NIE einen direkten Zugang zu den Sammlungen außerhalb der Klasse ermöglichen, die sie enthält.

Die Haupt Überlegung dahinter ist, dass es fast immer eine Art von Business-Logik auf die Sammlung von Daten angebracht - zum Beispiel, Validierung auf Additions- oder einen Tag vielleicht brauchen Sie eine zweite eng verwandte Sammlung hinzuzufügen.

Wenn Sie den Zugriff wie Sie sprechen, wird es in Zukunft sehr schwierig sein, eine Änderung wie diese zu machen.

Oh, auch, finde ich oft, dass ich irgendwann ein wenig mehr Daten mit dem Objekt gespeichert werden muß, ich bin zu speichern - so erstelle ich ein neues Objekt (nur innerhalb des „Containers“ ist bekannt, dass die Sammlung beherbergt) und I setzen sie das Objekt im Innern, bevor es in der Sammlung setzen.

Wenn Sie Ihre Sammlung gesperrt gehalten haben, ist dies eine triviale refactor. Versuchen Sie sich vorzustellen, wie schwierig es in einigen Fällen wäre Sie gearbeitet habe, wo man nicht die Sammlung halten hat gesperrt ...

Wenn Sie Hinzufügen und Entfernen von Funktionen Foo unterstützen wollen, würde ich die Methoden addFoo vorschlagen () und removeFoo (). Ich idealerweise könnte man die getFoo bei zusammen beseitigen, indem ein Verfahren für jedes Stück Funktionalität Erstellen Sie benötigen. Dies wird deutlich in Bezug auf die Funktionen, die ein Anrufer auf der Liste der Vorform wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top