繁体   English   中英

Java Final 类或私有构造函数

[英]Java Final class or private constructor

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

final class Myclass {}

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

class Myclass {
     private Myclass() {}
}

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

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

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

但是当我们声明 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();
    }
}

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

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

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

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

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

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

我通常做的是将类final并将构造函数private

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

.

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM