【问题标题】:Overloading constructor VS passing null while createing objects in Java在Java中创建对象时重载构造函数VS传递null
【发布时间】:2012-05-23 17:12:31
【问题描述】:

如果一个类在对象创建过程中需要多个字段信息,并且它允许的信息更少。比我们有两个选项
1.提供多个构造函数,或者
2. 允许客户端在创建对象时传递空参数。

其中最好的做法是。 例如:
案例 1:

public class Test {
    Test(A ob1,B ob2, C ob3){

    }
    Test(A ob1,B ob2){
            this(ob1, ob2, null);    
    }
    public static void main(String args[]){
        Test ob = new Test(new A(),new B());
    }
}

案例 2:

public class Test {
    Test(A ob1,B ob2, C ob3){

    }
    public static void main(String args[]){
        Test ob = new Test(new A(),new B(), null);
    }
}

我在同一个类中使用过 main 方法。请在其他类中考虑这些主要方法。

【问题讨论】:

    标签: java constructor


    【解决方案1】:

    使用多个构造函数是最好的。许多标准 API 库也实现了它。 此外,它使代码松散耦合,通过传递显式“null”值来创建对象不是一个好习惯。

    案例 2 增加了高耦合的机会。

    除了主要问题: 阅读更多:Best way to handle multiple constructors in Java

    编辑:

    使用命名工厂方法来构造对象是更好的做法,因为它们比拥有多个构造函数更能自我记录。 [Joshua Bloch 的《Effective Java》]

    【讨论】:

    • 关于构造函数链的用法的声明对于大多数 API 都是正确的。但我记得我上次看到在其中一些 API 中传递 null 是什么时候。如果一个对象可以在没有一些值的情况下被构造,通常它不应该是构造函数的一部分。
    【解决方案2】:

    案例 3,提供将创建对象的方法。

    public class A {
    
      public static A create(B b) {
         A a = new A();
           a.setB(b);
      }
    
      public static A create(B b, C c) {
         A a = create(b);
           a.setC(c);
    
       return a;
      }
    
      private A() {} 
    
      public void setB(B);
      public void setC(C);
    
    } 
    

    构造函数应该能够创建对象以防止内存泄漏。其中较少的参数可以最大程度地减少发生 NullPointerException 的情况。提供像呈现的工厂方法将降低风险并改善对对象的控制。

    【讨论】:

    • A 对象没有 BC 对象可能是无效的。我宁愿不能创建无效的A(即使它只是在工厂方法中)。
    • 这比使用构造函数更好吗?
    • @djna,这取决于以这种方式创建的对象。如果在创建过程中可能出现问题,则不应通过构造函数对其进行初始化。如果 Constructor 只为成员​​分配引用,则不应使用此解决方案。
    • @JoachimSauer,如果我理解正确,我们可能希望在创建实例之前添加一些断言,并且由于 A 的构造函数是私有的,因此无法从其他地方访问它,因此可以创建 A 的实例只能通过工厂方法。
    • @Vash 如果在构建过程中出现问题,我们可以抛出异常。在这种“工厂”案例和普通构造函数中,我认为错误处理可能性没有区别。我无法看到工厂习语的优势。
    【解决方案3】:

    案例一是偏好。这是在 API 中具有此选项的大多数类中完成的。这也意味着您可以根据需要在未来版本中更改第二个/第三个/... 参数,而无需升级对构造函数的调用。

    【讨论】:

      【解决方案4】:

      第一种情况是最好的。为什么要避免使用多个构造函数?除非你不打电话给他们,否则他们不会打扰你。拥有不同的构造函数也增加了代码的可读性,因为实例化对象需要哪些参数是很清楚的,而在 null 情况下,您总是必须查看不需要哪些参数。

      【讨论】:

        【解决方案5】:

        不输入空值,因此您可能会为未来的错误和怀疑

         new Thing( myA, null, null)
        

        这里并不清楚意图是传递一个空B和一个空C,

         new Thing (myA)
        

        是明确的

        【讨论】:

        • 在这种情况下,我总是可以输入 Null。
        • @shantanu,你可以,但没有强迫这样做,所以你,或者一个不太勤奋的人不会然后我们得到可维护性较差的代码。类作者通过不提供单独的构造函数给客户更多的工作要做。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-24
        • 1970-01-01
        • 1970-01-01
        • 2020-05-24
        • 2020-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多