Java Final类或私有构造函数

时间:2020-03-22 21:00:32

标签: java inheritance final private-constructor

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

final class Myclass {}

但是当我们将构造函数声明为私有时,它将具有相同的效果,

class Myclass {
     private Myclass() {}
}

但是真的一样吗?代码优化或代码可读性是否有区别?以及哪些类必须接近继承

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

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

3 个答案:

答案 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

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

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

也就是说,java.util.Arrays没有任何问题。设计人员以所需的最小值(私有构造函数)实现了所需的效果(非稳定性)。

答案 2 :(得分:0)

如果您要创建一个不可变的类,或者仅出于某种原因而创建一个不带子类的类,则应将其声明为final。私有构造函数应在实用工具类中使用,这样可以阻止继承并确保不能创建该类的实例。

相关问题