質問
...ここに行く...私は単にテストを自分で書いていないために燃え上がっを取得するつもり実現...しかし、私は人々の意見だけでなく、機能について興味ので、
私は、プライベートリストを持つクラスを持っています。私は公共getMyList()メソッドを介してそのプライベートリストに追加する。
そう...この作品は、だろうか?
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");
}
}
解決
はい、それは絶対に動作します - 通常は悪いことです。 (あなたが本当にコレクションオブジェクトではなく、コレクション自体のコピーをの参照をの帰国しているためです。)
は、非常に多くの場合、あなたは通常、コレクションの周りに読み取り専用のラッパーを返す意味コレクションに真に読み取り専用アクセスを提供したいです。戻り値は、コレクションで実装読み取り専用のインターフェイスを入力し作成し、実際のコレクションの参照を返すことは多くの保護を提供していません:呼び出し側が簡単に「本物」コレクション型にキャストして、問題なく追加することができます。
他のヒント
確かに、ではない良いアイデア。あなたはその場での読み取り専用バージョンを提供できない場合はコピーを作成し、外部のあなたの可変メンバを公開しないでください...
public class ObA{
private List<String> foo;
public List<String> getFoo(){return Collections.unmodifiableList(foo);}
public void addString(String value) { foo.add(value); }
}
、私はOBAにgetFoo()
の呼び出しを削除し、add(String msg)
とremove(String msg)
メソッドを追加(またはあなたが公開する他のどんな機能)と思います。
は常に私の経験では悪いことであると思われるコレクションへのアクセスを与える - 彼らは外に出たら、コントロールすることは事実上不可能である主な理由。私は決してそれらを含むクラス外のコレクションへの直接アクセスを許可しないのが習慣に撮影した。
たとえば、追加または2番目の密接に関連するコレクションを追加する必要がありますおそらくいくつかの日に検証 -この背後にある主な理由は、データの収集に添付ビジネスロジックのいくつかの並べ替えがほとんど常に存在することです。
あなたが話しているように、あなたがアクセスを許可する場合は、このような変更を行うために、将来的に非常に困難になります。
ああ、また、私はよく、私は最終的に私が保管していたオブジェクトに少しより多くのデータを保存するために持っていることを発見 - 私は(唯一のコレクションを収容する「コンテナ」内で知られている)新しいオブジェクトを作成し、Iコレクションにそれを置く前に、その内部のオブジェクトを入れます。
あなたのコレクションをロックダウン守ってきた場合は、、これは些細なリファクタリングです。それはあなたがロックダウンされたコレクションを保持していなかった場所で働いてきたいくつかのケースではだろういかに難しいか想像してみてください...
あなたがfooへの追加と削除機能をサポートしたい場合は、私は方法のaddFooを示唆している()とremoveFoo()。私は、理想的にはあなたが必要な機能の各部分のための方法を作成することによってで一緒からgetfooを排除することができます。これは、呼び出し側がリストにプリフォームになる機能に関しては、それを明確にする。