我有一个由基类B实现的接口。基类由一堆类(A,C,D)扩展,这些类必须初始化在基类B中声明的一些受保护的变量。 d喜欢在子类(A,C,D)中强制构造函数的声明,以阻止用户依赖于在B中声明的默认构造函数。但是我做想要B的默认构造函数自动执行,因为B也可以单独使用。我怎么能做到这一点?
感谢
答案 0 :(得分:3)
使用B的抽象超类和私有构造函数:
public abstract class BSuper {
private BSuper() {
// initialize stuff
}
protected BSuper(some params) {
this():
// other init with parms
}
}
public class B extends BSuper {
public B(some other params) {
super(some params);
}
}
public class A extends B {
public A() {
super(some other params);
}
}
或类似的
答案 1 :(得分:0)
将B的默认构造函数设为私有并调用this();来自参数化构造函数...
public class B {
private B() {
super();
}
public B( Foo foo ) {
this();
}
public static B createInstance() {
return new B();
}
}
编辑:Miss读了这个问题,从类声明中删除了abstract关键字。还添加了public static factory方法来创建B类。它调用B的默认构造函数。
答案 2 :(得分:0)
只需在Javadoc中写一条评论,说“在子类化时不鼓励使用默认构造函数”。根据我的经验,尝试以编程方式强制执行该操作并不值得付出努力,并可能导致后续问题。简单的英语就可以了。
答案 3 :(得分:0)
如果B类将拥有自己的默认构造函数,那么你想要的就是不可能的。当您从类派生时,您告诉编译器它应该在派生类的每个实例中为基类对象分配内存。每次从它继承某些内容时,都无法告诉java编译器突然删除某些基类的功能。
另请注意,构造函数和静态工厂方法不能是抽象的,因此即使B可能是抽象类,您也必须执行以下操作:
public class B {
B() {
initialize();
}
protected abstract void initialize();
}
...同时确保派生类实现调用super()
的默认构造函数