如何在Enum Singleton中处理TreeSet作为成员变量

时间:2012-01-17 18:50:31

标签: java enums arraylist singleton

这可能是一个愚蠢的问题,但却让我陷入困境。

我使用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?

2 个答案:

答案 0 :(得分:3)

Edit类型只有一个实例,因此只有一个TreeSet<String>

每次拨打createList时,都会向同一TreeSet添加更多值。

你说:

  

我知道单例类的目的是确保该类只有一个且只有一个全局实例,但对于类成员变量是否适用?

如果它不适用于成员变量,那么重点是什么?这就是单个实例的有趣之处 - 它有自己的状态。

一般来说,枚举是一个非常糟糕的想法 - 通常它们可能代表特定的,可能与行为有关。同样,我很少有可变的单例 - 它引入了线程问题等,因为你自然有共享状态。

答案 1 :(得分:1)

  

。那些新的5个字符串是否会与前10个字符串一起添加到TreeSet中,还是会被添加到完全不同的(新)TreeSet中?

它们将被添加到TreeSet相同实例中。无论如何都没有TreeSet的其他实例可以添加。这是因为封闭类型Edit被声明为Enum,并且其中只有一个实例INSTANCE

如果您在Edit类型(INSTANCE1INSTANCE2;)中声明了两个实例,则会有两个单独的TreeSet个实例,每个实例一个INSTANCE 1}} Edit类型的成员。