这可能是一个愚蠢的问题,但却让我陷入困境。
我使用Java中的枚举实现了一个单例类(我知道它们是邪恶的),如下所示
public enum Edit {
INSTANCE;
private TreeSet<String> list1 = new TreeSet<String>();
public void createList(Scanner input) {
while (input.hasNext()) {
list1.add(input.next());
}
我的问题是当你在应用程序的多个地方使用createList方法时,TreeSet会发生什么?
例如说第一次在应用程序中调用Edit.INSTANCE.createList()时,10个字符串被添加到list1,现在第二次被调用,5个字符串被添加到list1 ....将是那些新的使用前10个字符串将5个字符串添加到TreeSet中,还是将它们添加到完全不同的(新)TreeSet中?
我知道单例类的目的是确保该类只有一个且只有一个全局实例,但对于类成员变量是否适用?在上面的例子中是否只有list1的一个副本,或者每次调用createList()方法时都创建了一个新的TreeSet?
答案 0 :(得分:3)
Edit
类型只有一个实例,因此只有一个TreeSet<String>
。
每次拨打createList
时,都会向同一TreeSet
添加更多值。
你说:
我知道单例类的目的是确保该类只有一个且只有一个全局实例,但对于类成员变量是否适用?
如果它不适用于成员变量,那么重点是什么?这就是单个实例的有趣之处 - 它有自己的状态。
一般来说,枚举是一个非常糟糕的想法 - 通常它们可能代表特定的值,可能与行为有关。同样,我很少有可变的单例 - 它引入了线程问题等,因为你自然有共享状态。
答案 1 :(得分:1)
。那些新的5个字符串是否会与前10个字符串一起添加到TreeSet中,还是会被添加到完全不同的(新)TreeSet中?
它们将被添加到TreeSet
的相同实例中。无论如何都没有TreeSet
的其他实例可以添加。这是因为封闭类型Edit
被声明为Enum
,并且其中只有一个实例INSTANCE
。
如果您在Edit
类型(INSTANCE1
,INSTANCE2
;)中声明了两个实例,则会有两个单独的TreeSet
个实例,每个实例一个INSTANCE
1}} Edit
类型的成员。