重载构造函数与在Java中创建对象时传递null

重载构造函数与在Java中创建对象时传递null,java,constructor,Java,Constructor,如果一个类在对象创建期间需要多个字段信息,并且它允许的信息也比我们有两个选项少 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(Strin

如果一个类在对象创建期间需要多个字段信息,并且它允许的信息也比我们有两个选项少
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());
    }
}
案例二:

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方法。请考虑其他课程中的主要方法。

< P>在具有此选项的API中的大多数类中都会执行此操作。这也意味着您可以更改第二个/第三个/。。。参数在以后的版本中,如果需要,不必升级对构造函数的调用。

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

情况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的情况降至最低。提供如本文所述的工厂方法将降低该风险并改善对对象的控制

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

情况2增加了高耦合的可能性

除主要问题外: 阅读更多:

编辑:


更好的做法是使用命名工厂方法来构造对象,因为它们比具有多个构造函数更具有自文档性。[Joshua Bloch的有效Java]

未键入空值,因此您可能会产生未来的错误和疑问

 new Thing( myA, null, null)
这里不清楚目的是传递空B和空C

 new Thing (myA)

是明确的

没有B或
C
对象的
A
对象很可能无效。我宁愿一个无效的
A
不能被创建(即使它只是在工厂方法中)。这比使用构造函数更好吗?@djna,这取决于以这种方式创建的对象。如果在创建过程中出现问题,则不应通过构造函数初始化。若构造函数只给成员分配引用,那个么就不应该使用这个解决方案。@JoachimSauer,若我理解正确的话,我们可能希望在创建实例之前添加一些断言,由于A的构造函数是私有的,因此无法从其他位置访问它,因此只能通过工厂方法创建它的实例。@Vash如果在构造过程中出现问题,我们可以抛出异常。我认为在这个“工厂”案例和普通构造函数中,错误处理的可能性没有区别。我很难理解工厂习惯用法的优点。在这种情况下,我总是可以键入Null。@shantanu,你可以,但没有强制这样做,所以你或者一个不太勤奋的人不会这样做,这样我们就得到了更少的可维护代码。类作者没有提供单独的构造函数,这给了客户端更多的工作要做。关于构造函数链接用法的声明对于大多数API都是正确的。但我能回忆起上次在某些API中看到传递
null
的时间。如果一个对象可以在没有任何值的情况下构造,那么它通常不应该是构造函数的一部分。