因此,如果您在一个类中有一个对象集合。并且您希望将一些对象添加到该集合中。哪种方式更准确?
这样:
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
类的范围内。你也可以用addB
从A
中提取一个interface
,使其成为更多的SOLID
。
我认为如果你认为你永远不需要在主方法中(在Test类中)使用B实例,第二种方法更干净可读,但如果你认为将来需要在"Test"类中使用B实例的话,你最好在那里实例化B。