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

时间:2014-09-25 11:55:18

标签: java enums singleton

在阅读this问题的答案后,这是一个跟进问题。大多数人都热衷于推荐single element enums超过singleton class的实施。例如:

使用枚举的单身人士:

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

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

我的问题:如果这是一个愚蠢的问题,请原谅我。由于单身人士能够维持应用程序的全局状态,在使用single element enums实现单例时,如何使用单身人员保持不同的状态?

例如,如果我希望我的单身人士继续关注;

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

如何使用single element enums

2 个答案:

答案 0 :(得分:1)

无论什么"州"你想要作为单身人士的一部分应该添加到单身实例本身。在下面的示例中,我添加了一个String to Singleton" state"。

enum Singleton{
INSTANCE("some string");

    private String myString;
    public void doStuff(){
        //......
    }
    public void doMoreStuff(){
        //......
    }

    Singleton (String myString_){
      myString = myString_;
    }
}

答案 1 :(得分:1)

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;
        }
    }

当然存在很多差异,例如枚举默认是最终的(你不能扩展它们),你不能为枚举创建公共构造函数,枚举在序列化/反序列化期间有特殊行为等等。但毕竟,它们只是普通的课程,你可以期望它们在常见的情况下表现得像班级一样。