在java中,如何使用私有构造函数创建一个类,其超类也有一个私有构造函数?

Han*_*son 5 java constructor

举个例子:

public class Foo {
    private Foo() {}
}

public class Bar extends Foo {
    private Bar() {}

    static public doSomething() {
    }
}
Run Code Online (Sandbox Code Playgroud)

那是一个编译错误.一个类至少需要隐式调用它的超类的默认构造函数,在这种情况下,它在Foo中是不可见的.

我可以从Bar调用Object的构造函数吗?

Ric*_*ton 10

你不能.你需要让Foo的构造函数包至少是私有的(虽然我可能只是让它受到保护.

(编辑 - 这篇文章中的评论很有用)


Chi*_*hii 7

这实际上是一种糟糕的继承形式的症状,称为实现继承.原始类不是为了继承而设计的,因此选择使用私有构造函数,或者整个API设计不当.

解决这个问题的方法不是找出继承的方法,而是要查看是否可以组合对象而不是继承,并通过接口来实现.即,Foo类现在是Foo接口,具有FooImpl.然后界面栏可以扩展Foo,使用BarImpl,它与FooImpl无关.

在BarImpl内部,如果你想做一些代码重用,你可以将FooImpl作为成员,但这完全取决于实现,并且不会暴露.