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

时间:2016-05-29 08:42:41

标签: java

所以,如果你有一个类的对象集合。并且您想要向该集合添加一些对象。哪种方式更准确?

这样:

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执行make对象的工作,并且可以使用“addMultipleB”方法,只需传递带有“rawData”的String数组。但是,这使得A更容易出错(如果Rawdata不正确)并且对B中的任何修改都很脆弱。

那么,哪一个更正确选择OO?

3 个答案:

答案 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类范围内。您还可以使用interfaceA中提取addB,使其更加SOLID

答案 2 :(得分:1)

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