在Java中声明默认构造函数有什么意义吗?

时间:2010-03-12 09:57:47

标签: java constructor

在Java中声明默认构造函数是否有意义?

class MyClass {
  public MyClass(){}
  public MyClass( T someArgs){
    //somecode
  }

}

5 个答案:

答案 0 :(得分:8)

如果您有非默认构造函数,则默认构造函数不会隐式可用。如果你的目标不是让任何人做的话,最好不要放一个:

MyClass myClass = new MyClass();

答案 1 :(得分:6)

如果您指定没有其他构造函数,Java会添加一个默认的公共no-args构造函数,因此如果您需要一个并指定另一个构建函数,则有一个点。所以在你的情况下,如果你这样定义你的类:

class MyClass {
  public MyClass( T someArgs){
    //somecode
  }
}

然后你不能这样做:

MyClass a = new MyClass();

但如果定义如下:

class MyClass {
  // no constructors
}
你可以。

通常使用no-arg构造函数来指定伪默认参数。例如:

class Switch {
  private boolean on;

  public Switch() { this(true); }
  public Switch(boolean on) { this.on = on; }
  public boolean isOn() { return on; }
  public boolean toggle() { on = !on; }
  public boolean set(boolean on) { this.on = on; return this.on; }
}

答案 2 :(得分:6)

是的,当你有其他构造函数时。

  • 如果您愿意,则需要 创建对象而不传递任何 构造函数的参数。

  • 在大多数情况下,它是必需的 反思,特别是当你工作时 以某种反思为基础 框架和库(例如序列化,Hibernate,Hessian)。

  • 通常可以使用setter 给你更好的控制。它也是 适用于继承(在哪里 你需要明确地调用 所有专业的构造函数 类,作为构造函数不是 虚拟

答案 3 :(得分:3)

除了以前所有关于no-args构造函数的参数,它都是JavaBeans的必需元素,因为这些bean可以使用反射创建(特别是通过调用Class.newInstance)。因此,任何依赖JavaBeans的框架都会使这个无参数构造函数成为您架构的必备部分。

还有一个额外的好处,因为no-args构造函数可以通过让你链接setter调用来帮助引入一种流畅的界面。例如,在我工作的公司中,用于在setter和getter旁边定义这样的方法:

class MyClass {
    privaite int index;
    public int getIndex() { return index; }
    public void setindex(int index) { this.index = index; }

    public MyClass withIndex(int index) {
        setIndex(index);
        return this;
    }
}

允许我按以下方式创建对象:

MyClass myObject = new MyClass().withIndex(2);

这是一种非常有用的创建对象的方法,无需定义bug构造函数。

答案 4 :(得分:0)

某些框架将要求您具有零参数/默认构造函数。例如,您需要一个作为JUnit测试用例运行类。 [编辑:删除了错误的陈述]

这是因为他们使用反射。