2

当我们想要关闭一个类以继承时,我们使用 final 声明类,

final class Myclass {}

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

class Myclass {
     private Myclass() {}
}

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

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

但是即使声明了所有方法,也java.util.Arrays没有声明第二个选项。finalArraysstatic

4

3 回答 3

3

但是当我们声明 ctor 私有时,效果是一样的

不一定,考虑这个使用静态类的例子:

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

这将打印“我有一个私有构造函数”。

但真的一样吗?代码优化或代码可读性有什么区别。哪些类必须接近继承,

当开发人员看到一个类是 final 时,他们就会明白作者的意图是不应该扩展它。

当开发人员看到一个类有一个私有构造函数时,他们就明白这个类不能被实例化。这通常是因为它要么是静态实用程序类,要么是单例。

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

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

于 2020-03-22T21:43:08.017 回答
1

我通常做的是创建类final 构造函数private

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

.

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

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

于 2020-03-22T21:19:55.440 回答
0

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

于 2020-03-22T21:16:03.103 回答