Java 如何在枚举单例中处理作为成员变量的树集

Java 如何在枚举单例中处理作为成员变量的树集,java,enums,arraylist,singleton,Java,Enums,Arraylist,Singleton,这可能是一个愚蠢的问题,但却让我感到困惑 我已经使用Java中的枚举实现了一个单例类(我知道它们是邪恶的),如下所示 public enum Edit { INSTANCE; private TreeSet<String> list1 = new TreeSet<String>(); public void createList(Scanner input) { while (input.hasNext()) {

这可能是一个愚蠢的问题,但却让我感到困惑

我已经使用Java中的枚举实现了一个单例类(我知道它们是邪恶的),如下所示

public enum Edit {

   INSTANCE;

   private TreeSet<String> list1 = new TreeSet<String>();

   public void createList(Scanner input) {
        while (input.hasNext()) {
            list1.add(input.next());
        }
公共枚举编辑{
实例;
私有树集列表1=新树集();
公共无效创建列表(扫描程序输入){
while(input.hasNext()){
list1.add(input.next());
}
我的问题是,当您在应用程序中的多个位置使用createList方法时,TreeSet会发生什么情况

例如,在应用程序中第一次调用Edit.INSTANCE.createList()时,10个字符串被添加到列表1中,现在第二次调用时,5个字符串被添加到列表1中……这些新的5个字符串是与以前的10个字符串一起添加到树集,还是添加到完全不同的(新)树集


我知道singleton类的目的是确保该类有且只有一个全局实例,但这对类成员变量是否成立?在上述示例中,list1是否只有一个副本,或者每次createList()方法被调用时是否创建了新的树集?

只有一个
Edit
类型的实例,因此只有一个
TreeSet

每次调用
createList
,它都会向同一
TreeSet
添加更多值

你说:

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

如果它不适用于成员变量,那又有什么意义呢?这就是单个实例的有趣之处——它有自己的状态

一般来说,枚举是可变的是一个非常糟糕的主意——通常它们是用来表示特定的值,可能带有行为。同样,我很少有可变的单例——它引入了线程问题等,因为您自然有共享状态

。这些新的5个字符串将与之前的10个字符串一起添加到树集中,还是将它们添加到完全不同的(新)树集中

它们将被添加到
TreeSet
的同一个实例中。没有任何其他
TreeSet
实例可添加到。这是因为封闭类型
Edit
声明为
Enum
,其中只有一个实例
instance


如果有两个实例声明到
编辑
类型中(
INSTANCE1
INSTANCE2
;),然后将有两个独立的
TreeSet
实例,每个
实例都是
Edit
类型的
成员。

在深入研究此类主题之前,可能值得先学习一点OOP的基础知识。我觉得您还没有完全掌握类是什么。错了,先生,我确实有一个很好的方法关于类是什么的想法。这是一个我想澄清的问题,因为我知道单例被认为是不好的,我想完全理解它们。在这种情况下,你自己回答了这个问题:“我知道单例类的目的是确保该类有一个且只有一个全局实例”@Steven Jeuris也许我的问题没有我希望的那么清楚。它必须更多地处理单例中的成员变量,而不是单例本身。请参阅我对Jon Skeet回答的评论,了解我的提问原因。我也不知道ArrayList来自何方,抱歉,后期编辑。@Hexose:好的,我已经删除了这句话。r有什么意义吗?@Jon Skeet是的,有意义(谢谢),你已经证实了我最初的想法。但让我困惑的是,我有一个输入文件,我用这个单件来切碎并输出到不同的文本文件。(帖子中的代码与我使用的代码不同。)第一次调用createList时,我打印出第一个文件。当创建第二个文件时,它不包含第一个文件中的任何信息。我认为它应该包含第一个文件中的信息,因为TreeSet位于singleton类中。@Hexose:不清楚为什么要使用singleton,但这很简单我建议你单独提出一个问题,用一个简短但完整的例子来说明这个问题。我解决了我的困惑,谢谢你的帮助和后续文章。非常感谢。