Java 最终 class 或私有构造函数

Java Final class or private constructor

当我们想关闭一个 class 继承时,我们用 final 声明 class,

final class Myclass {}

但是当我们将构造函数声明为private时,效果是一样的,

class Myclass {
     private Myclass() {}
}

但真的一样吗?代码的优化或代码的可读性有什么区别吗?还有哪些classes要接近继承,

  1. 不可变class也许
  2. class
  3. 的每个方法和成员变量声明为静态

但是对于第二个选项 java.util.Arrays 还没有用 final 声明,即使 Arrays 的所有方法都被声明 static.

如果你想创建一个不可变的 class 或者只是一个 class 由于某种原因不应该有孩子,你应该将其声明为最终的。私有构造函数应在实用程序 classes 中使用,这样可以阻止继承并确保无法创建 class 的实例。

我通常做的是让classfinal构造函数private:

  1. 它消除了关于 class 使用的歧义(强调它是一个实用程序 class)
  2. 它让用户远离他们不应该做的事情(启动、扩展)。

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class HttpTool {}

也就是说,java.util.Arrays 没有任何问题。设计者以必要的最低限度(私有构造函数)实现了预期的效果(不可实例化)。

but when we declare ctor private it will be the same effect

不一定,请考虑使用静态 classes 的示例:

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();
    }
}

这将打印 "I have a private constructor"。

but is it really same? is there any difference for optimization of code or readablity of code. and which classes has to close to inheritance,

当开发人员看到 class 是最终版本时,他们明白作者的意图是不应扩展它。

当开发人员看到 class 具有私有构造函数时,他们就会明白 class 无法实例化。这通常是因为它是静态实用程序 class 或单例。

But for second option java.util.Arrays hasn't declared with final even if all methods of Arrays declared static

这是一个很好的观察。我的猜测是它可能应该是但现在不能为了向后兼容性而改变。