如何使构造函数定义成为必需的

时间:2011-10-11 19:33:59

标签: java

我有一个由基类B实现的接口。基类由一堆类(A,C,D)扩展,这些类必须初始化在基类B中声明的一些受保护的变量。 d喜欢在子类(A,C,D)中强制构造函数的声明,以阻止用户依赖于在B中声明的默认构造函数。但是我想要B的默认构造函数自动执行,因为B也可以单独使用。我怎么能做到这一点?

感谢

4 个答案:

答案 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()

的默认构造函数