在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中,如何创建一个具有私有构造函数的类,其超类也有一个私有构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

具有私有构造函数和析构函数的类对象的向量?

为啥具有私有构造函数的类不阻止从此类继承?如何控制哪些类可以从某个基类继承?

Java:当具有受保护的构造函数时,如何从 java.io 为 Reader 类创建新的类对象

C ++中的静态构造函数?我需要初始化私有静态对象

Java中私有构造函数有啥用?

在 C# 中从类外部访问私有构造函数