在对象组合中创建新实例的责任



因此,如果您在一个类中有一个对象集合。并且您希望将一些对象添加到该集合中。哪种方式更准确?

这样:

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;
}

或者这个:

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类定义发生更改,则不必修改A中的addB方法。但是,如果要同时添加多个对象,则必须自己处理此问题

在第二个:

  • 客户端向A提供必要的信息(rawData),A完成创建对象的工作,并且可以有一个"addMultipleB"方法,其中你只需传递一个带有"rawData"的字符串数组。但是,这使得A更容易出错(如果Rawdata不正确),并且对B中的任何修改都很脆弱

那么,哪一个选项更适合OO?

对于如此宽泛的问题,答案是:这取决于情况。

如果:你的类B是内部的,你只想在类A中使用,或者可能在一个小包中的几个类中使用,那么你可以选择选项2。

但一般来说,选项1是首选选项:你看,如果你使用B类来"建模"代表"B对象"的东西。。。则所有代码都应该使用B对象。重点是:您的B类添加了一个抽象。现在还没有,但它可以很容易地扩展为不仅仅是int/string的组合。意思是:你的一些"B相关"数据作为真正的B对象存在,而其他数据可能作为"原始字符串"存在,这是一个坏主意。

最后:牢记SOLID原则;就在这里,第一个原则(单一责任原则)给了你一个提示——从某种意义上说:把一个原始字符串变成B,并存储B,等等。。。可能是不同的责任;然后可能会进入不同的班级。

我认为函数的名称在第二种情况下具有误导性。它应该类似于:createAndAddNewBInstance。此外,第二种方法使A类取决于类B的实现。

如果你想在这两个类之间创建一个连接,那么在B类中创建一个static函数会更合理,该函数接受rawData并引用A实例,创建一个新的B实例,并通过addB将其添加到A

class B {
static void createNewInstanceAndAddToA(String rawData, A aInstance){...}
...
}

这样,B的实现细节就在B类的范围内。你也可以用addBA中提取一个interface,使其成为更多的SOLID

我认为如果你认为你永远不需要在主方法中(在Test类中)使用B实例,第二种方法更干净可读,但如果你认为将来需要在"Test"类中使用B实例的话,你最好在那里实例化B。

最新更新