在java中,如何创建一个具有私有构造函数的类,其超类也有一个私有构造函数?
Posted
技术标签:
【中文标题】在java中,如何创建一个具有私有构造函数的类,其超类也有一个私有构造函数?【英文标题】:In java, how do I make a class with a private constructor whose superclass also has a private constructor? 【发布时间】:2009-01-20 16:44:36 【问题描述】:举个例子:
public class Foo
private Foo()
public class Bar extends Foo
private Bar()
static public doSomething()
这是一个编译错误。一个类至少需要隐式调用其超类的默认构造函数,在这种情况下,它在 Foo 中是不可见的。
我可以从 Bar 调用 Object 的构造函数吗?
【问题讨论】:
是否有理由将 Foo() 设为私有而不是受到保护? @svelil:假设它在第三方库中,或者在我的控制之外,我想继承它。 【参考方案1】:你不能。您至少需要将 Foo 的构造函数包设为私有(尽管我可能只是将其设为受保护。
(编辑 - 这篇文章中的评论是一个很好的观点)
【讨论】:
包私有就足够了,如果两者都放在同一个包中。 @starblue - 我相信这就是他说“至少”的原因。 包比受保护的限制更多,所以“至少”是错误的。如果两者都在同一个外部类中,我认为私有构造将是可访问的。【参考方案2】:这实际上是一种不良继承形式的症状,称为实现继承。要么原始类没有被设计为被继承,因此选择使用私有构造函数,或者整个 API 设计不佳。
解决这个问题的方法不是想办法继承,而是看看你是否可以组合对象而不是继承,并通过接口来实现。即,类 Foo 现在是接口 Foo,带有 FooImpl。那么界面bar可以扩展Foo,带有一个与FooImpl无关的BarImpl。
在 BarImpl 中,如果您希望进行一些代码重用,您可以在内部有一个 FooImpl 作为成员,但这完全取决于实现,不会暴露。
【讨论】:
【参考方案3】:只要 Foo 具有私有构造函数,您就无法创建 Bar 的实例。如果 Foo 有一个受保护的构造函数,您可以这样做的唯一方法。
【讨论】:
如果超类有私有构造函数,那么子类甚至不会编译。【参考方案4】:当它是 Foo 的子类时,你不能直接从 Bar 调用 Object 的构造函数,它必须通过 Foo 的构造函数,在这种情况下它是私有的。
当您将 Foo 的构造函数声明为私有时,它不会创建默认的公共构造函数。由于 Bar 必须 调用 Foo 的构造函数,因此不可能将其保留为私有。我会像其他人一样建议使用受保护而不是私有。
【讨论】:
以上是关于在java中,如何创建一个具有私有构造函数的类,其超类也有一个私有构造函数?的主要内容,如果未能解决你的问题,请参考以下文章
为啥具有私有构造函数的类不阻止从此类继承?如何控制哪些类可以从某个基类继承?