当我们想关闭一个要继承的类时,我们用final声明该类,
final class Myclass {}
但是当我们将构造函数声明为私有时,它将具有相同的效果,
class Myclass {
private Myclass() {}
}
但是真的一样吗?代码优化或代码可读性是否有区别?以及哪些类必须接近继承
但是对于第二个选项java.util.Arrays
尚未用final
声明,即使Arrays
的所有方法都声明为static
。
答案 0 :(得分:3)
但是当我们将ctor声明为private时,将具有相同的效果
不一定,请考虑使用静态类的示例:
public class SOExample {
private static class ClassWithPrivateConstructor {
private ClassWithPrivateConstructor() {
System.out.println("I have a private constructor");
}
}
private static class ClassThatExtendsClassWithPrivateConstructor extends ClassWithPrivateConstructor {
}
public static void main(String[] args) {
new ClassThatExtendsClassWithPrivateConstructor();
}
}
这将显示“我有一个私有构造函数”。
但是真的一样吗?代码优化或代码可读性没有任何区别。以及哪些类必须接近继承
当开发人员看到某个类是最终的时,他们就会了解作者的意图是不应扩展该类。
当开发人员看到某个类具有私有构造函数时,他们知道该类无法实例化。通常是因为它是静态实用程序类还是单例。
但是对于第二个选项,即使Arrays的所有方法都声明为静态,java.util.Arrays都没有用final声明
这是一个很好的观察。我的猜测是,为了向后兼容,它可能应该已经但现在不能更改。
答案 1 :(得分:1)
我通常要做的是使类final
和构造函数private
:
。
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class HttpTool {}
也就是说,java.util.Arrays
没有任何问题。设计人员以所需的最小值(私有构造函数)实现了所需的效果(非稳定性)。
答案 2 :(得分:0)
如果您要创建一个不可变的类,或者仅出于某种原因而创建一个不带子类的类,则应将其声明为final。私有构造函数应在实用工具类中使用,这样可以阻止继承并确保不能创建该类的实例。