为什么不能直接访问单例实例?

时间:2019-11-20 05:22:47

标签: java singleton

例如:

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    // Private constructor suppresses
    // default public constructor
    private Singleton() {};

    public static Singleton getInstance() {
        return INSTANCE;
    }
  }

为什么我不能将INSTANCE设置为公开,并通过Singleton.INSTANCE进行访问?这会是什么原因?

3 个答案:

答案 0 :(得分:3)

从技术上讲,您可以,并且在此代码中,它将无效-行为相同。

我们通常使用吸气剂的原因是:

  • 一个好习惯-人们会惊讶地看到您直接访问变量
  • 灵活性-如果在调用getter的代码周围有一百个位置,那么更改方法的行为就很容易了(例如每次返回new Singleton()而不是访问静态变量)。如果有一百个地方直接访问该变量,则不是那么容易。

答案 1 :(得分:0)

由于其良好做法是封装实例以避免样板代码,因此在这种情况下,您需要使用静态块来初始化对象,如果在需要时初始化对象(延迟加载)会更好,那么这样做可能会有所帮助您的内存使用情况。

答案 2 :(得分:-1)

从技术上讲,您可以公开Singleton.INSTANCE,因为它是final。但是,从您的API用户的角度来看,Singleton.INSTANCE在不查看Singleton类的内容的情况下是最终的,因此用户可能会试图重新分配{{ 1}}来自另一个班级。

使Singleton.INSTANCE仅可通过Singleton.INSTANCE访问,这使每个人都知道不可能重新分配变量。