使用单个元素枚举在singleton中维护不同的属性



这是阅读该问题答案后的后续问题。大多数人如此热衷于推荐single element enums而不是singleton class实现。例如:

带枚举的Singleton:

public enum Singleton{
INSTANCE;
    public void doStuff(){
        //......
    }
    public void doMoreStuff(){
        //......
    }
}

根据Java文档;枚举类型是一种特殊的数据类型,它使变量成为一组预定义的常量。

我的问题:如果这是一个愚蠢的问题,请原谅。由于singleton能够维护应用程序的全局状态,所以在使用single element enums实现singleton时,如何使用singleton维护不同的状态?

例如,如果我想让我的单身汉保持追随者;

public myStringField="";
public int myIntField=0;

如何使用single element enums

enum视为一种特殊的类类型,不能实例化为常规类。相反,您有一种特殊的语法来在枚举声明中创建一个或多个枚举实例。但在几乎所有其他方面,枚举都只是常规类。

所以,粗略地说,您可以考虑以下两个相同的代码片段:

    public enum Enum {
        INSTANCE1,
        INSTANCE2("name");
        private String name;
        private Enum () {
            name = "";
        }
        private Enum (String name) {
            this.name = name;
        }
    }

    public final class Class {
        public static final Class INSTANCE1 = new Class();
        public static final Class INSTANCE2 = new Class("name");
        private String name;
        private Class () {
            name = "";
        }
        private Class (String name) {
            this.name = name;
        }
    }

当然,也有很多不同之处,例如枚举默认情况下是final(不能扩展它们),不能为枚举创建公共构造函数,枚举在序列化/反序列化过程中有特殊行为等等。但毕竟,它们只是常规类,在常见情况下可以预期它们的行为类似于类。

您想要作为singleton的一部分的任何"状态"都应该添加到singleton实例本身。在下面的例子中,我在Singleton"state"中添加了一个String。

enum Singleton{
INSTANCE("some string");
    private String myString;
    public void doStuff(){
        //......
    }
    public void doMoreStuff(){
        //......
    }
    Singleton (String myString_){
      myString = myString_;
    }
}

最新更新