这是阅读该问题答案后的后续问题。大多数人如此热衷于推荐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_;
}
}