在Java中声明默认构造函数是否有意义?
class MyClass {
public MyClass(){}
public MyClass( T someArgs){
//somecode
}
}
答案 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测试用例运行类。 [编辑:删除了错误的陈述]
这是因为他们使用反射。