抽象类中的私有构造函数

2022-09-03 03:35:53

在Java中,在抽象类中使用私有构造函数的目的是什么?

在评论中,我得到了这个问题,我很好奇,在什么情况下我们需要以这种方式使用构造函数?

我认为它可以与抽象类中的另一个构造函数成对使用,但这非常微不足道。此外,它还可用于构造静态内部类,这将扩展抽象类。

也许有更优雅的用法?


答案 1

如果构造函数是类的唯一构造函数,那么原因很清楚:防止子类化。某些类仅用作静态字段/方法的持有者,不希望被实例化或子类化。请注意,在这种情况下,修饰符是多余的 - 无论有没有它,都不可能进行实例化。正如@JB Nizet 在下面指出的那样,修饰符也是不好的做法,因为它向类的客户端发送了错误的信号。该类实际上应该是 .privateabstractabstractfinal

还有另一个用例,虽然非常罕见:你可以有一个只有构造函数,它包含自己的子类作为嵌套类。这个成语确保这些嵌套类是唯一的子类。事实上,Java中的s只使用这个成语。abstract classprivateenum

如果周围有其他构造函数,那么构造函数真的没什么特别的。它在类中使用,就像在任何其他类中使用一样。privateabstract


答案 2

我唯一能想到的是重用其他(受保护的)构造函数共享的公共代码。然后,他们可以在第一行中调用私有构造函数。