所以,如果你有一个类的对象集合。并且您想要向该集合添加一些对象。哪种方式更准确?
这样:
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;
}
在第一个:
在第二个:
那么,哪一个更正确选择OO?
答案 0 :(得分:2)
在如此广泛的问题上经常出现,答案是:它取决于。
如果:你的B类是内部的,你只想在A类中使用,或者在一个小包中的几个类中使用,那么你可以使用选项2。
但总的来说,选项1是首选:你看,如果你使用的是B类,那么#34; model&#34;代表&#34; B对象的东西&#34; ...然后所有代码应该使用B对象。关键是:你的B类增加了一个抽象。它现在不是,但它可以很容易地扩展为不仅仅是int / string的组合。含义:你的一些&#B; B相关&#34;是一个坏主意。数据作为真正的B对象存在,而其他数据可能作为&#34;原始字符串&#34;。
最后:请记住SOLID原则;在那里,第一个(单一责任原则)给你一个提示 - 意思是:将原始字符串转换为B,存储B,等等......可能是不同的责任;然后应该进入不同的班级。
答案 1 :(得分:2)
我相信该功能的名称在第二种情况下具有误导性。它应该是:createAndAddNewBInstance
。另外,第二种方法使A
类取决于类B
的实现。
如果你想在这两个类之间建立一个连接,那么在static
类中创建B
函数更合理,该函数需要rawData
并引用A
实例,创建一个新的B
实例,并通过A
将其添加到addB
。
class B {
static void createNewInstanceAndAddToA(String rawData, A aInstance){...}
...
}
这样,B
的实现细节就在B
类范围内。您还可以使用interface
从A
中提取addB
,使其更加SOLID
。
答案 2 :(得分:1)
我认为如果你认为你永远不需要在main方法中使用B实例(在Test类中),第二种方法更干净和可读,但如果你认为将来需要使用在“Test”类中的B实例,你最好在那里实例化。