クラス内にオブジェクトのコレクションがある場合。そして、そのコレクションにいくつかのオブジェクトを追加したいとします。どちらの方がより正確ですか?オブジェクトコンポジションで新しいインスタンスを作成する際の責任
この方法:
public class Test {
public static void main (String args []){
A aIntance = A();
B bIntance =B();
String rawData = "id=123,name=Bdude";
String id,name;
//do something to get the id and name from rawData...
//done.
//now we just make the object.
bIntance = new B(id,name);
aIntance.addB(bIntance); //A JUST add the object to his collection.
}
}
class A{
private List<B> b_list;
public void addB(B bIntance){
b_list.add(bIntance);
}
}
class B{
private String id;
private String name;
}
またはこの1:最初に
public class Test {
public static void main (String args []){
A aIntance = A();
aIntance.addB("id= 123,name=I'm B"); //A do the job of create the B object.
}
}
class A{
private List<B> b_list;
public void addB(String rawData){
String id,name;
//do something to get the id and name from rawData...
//done.
//now we just make the object.
B myB = new B(id,name);
b_list.add(myB);
}
}
class B{
private String id;
private String name;
}
:
- Bクラス定義が変更された場合、あなたは変更する必要はありませんaddBメソッドをAから削除します。ただし、複数のオブジェクトを同時に追加する場合は、問題を自分で処理する必要があります。二一
:
- クライアントA、およびAに必要な情報(生データ)を得るには、オブジェクトを作るの仕事をしてuはちょうど渡す「addMultipleB」メソッドを持つことができます「rawData」を持つ文字列の配列しかし、これにより、Aはエラーの影響を受けやすくなり(Rawdataが正しくない場合)、Bの変更が壊れやすくなります。
したがって、どのOOオプションが正しく選択されていますか?
サイドノート:あなたのBクラスには妥当なequals()/ hashCode()メソッド実装がありません。リストには関係ありませんが、比較のためにBオブジェクトを使用し始めると(例えばマップ/セットに配置するときなど)、予期せぬことが起こり始めるでしょう。 – GhostCat
@Jägermeister私は気付かなかった、ありがとう! – exsnake
もう1つは、Bを不変にすることです。意味:フィールドを最終的にする。コンストラクタを介してのみ設定することができます。 – GhostCat