【问题标题】:How to use the "single-element enum type" to make this class a singleton?如何使用“单元素枚举类型”让这个类成为单例?
【发布时间】:2015-01-09 14:05:49
【问题描述】:

我有这个类,我用这种方式作为单例使用:

FlagOfficer.instance().someVariable

这是该类的当前实现:

public class FlagOfficer {

    public FlagOfficer() {

    }

    static FlagOfficer flagOfficer = null;

    public static FlagOfficer instance() {
        if (flagOfficer == null) {
            flagOfficer = new FlagOfficer();
        }
        return flagOfficer;
    }

    public boolean getLastBackupDate;
    public boolean syncProcessStartedOnce;
}

我现在正在阅读“Effective Java”一书,他们说实现单例模式的最佳方法是使用单元素枚举类型

这是本书的一个例子:

public enum Elvis {
    INSTANCE;
    public void leaveTheBuilding() { ... }
}

那么我如何转换我的类以使其使用这种模式?之后我该如何使用它?

【问题讨论】:

  • 你的构造函数真的公开吗?任何人都可以调用 new FlagOfficer() 并且你有多个实例。
  • 伙计,很高兴你注意到了这一点!

标签: java enums


【解决方案1】:
public enum FlagOfficer {
    // Enum instances/values should be declared first.
    // Use INSTANCE(arg1, ..) if constructor accepts agruments.
    INSTANCE; 

    // Constructor can accept arguments as well.
    private FlagOfficer() {

    }

    private Date lastBackupDate;
    private boolean syncProcessStartedOnce;

    public Date getLastBackupDate() {
        return lastBackupDate;
    }

    public boolean isSyncProcessStartedOnce() {
        return syncProcessStartedOnce;
    }
 }

用法:

FlagOfficer fo = FlagOfficer.INSTANCE;

【讨论】:

  • 我可以在这里省略构造函数,还是应该将其保留为私有,以避免实例化?我可以不创建一个“fo”对象而只做 FlagOfficer.INSTANCE.someVariable = true/false 吗?
  • 构造函数可以省略。枚举可以像 Java 中的类一样声明。因此,您当然可以将枚举中的变量设为非私有变量,并根据需要直接访问它们。编辑:枚举构造函数是隐式私有的。见stackoverflow.com/questions/3664077
  • 您还可以添加一个public static FlagOfficer instance() { return INSTANCE;} 方法来获得单例类的感觉。这样,您的单身人士的消费者仍将像以前一样获得 FlagOfficer 对象:FlagOfficer.instance();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
相关资源
最近更新 更多