【问题标题】:How are TreeSets as member variables handled within an Enum Singleton如何在枚举单例中处理 TreeSet 作为成员变量
【发布时间】:2012-01-17 18:50:30
【问题描述】:

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

我已经使用 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....那些新的5 个字符串与之前的 10 个字符串一起添加到 TreeSet,还是将它们添加到完全不同的(新)TreeSet?

我知道单例类的目的是确保该类只有一个全局实例,但这对类成员变量是否成立?上例中 list1 是只有一个副本还是每次调用 createList() 方法都会创建一个新的 TreeSet?

【问题讨论】:

  • 在深入研究这些主题之前,先多学习一点 OOP 的基础知识可能是值得的。我的印象是你还没有完全掌握课程是什么。
  • 错了,先生,我确实知道什么是类。这是我想要澄清的一个问题,因为我知道单身人士被认为是糟糕的,我想完全理解它们。
  • 在这种情况下,您自己回答了这个问题:“我知道单例类的目的是确保该类只有一个全局实例”
  • @Steven Jeuris 也许我的问题没有我希望的那么清楚。它必须对单例中的成员变量做更多的事情,而不是单例本身。请参阅我对 Jon Skeet 回答的评论,了解我问的原因。

标签: java enums arraylist singleton


【解决方案1】:

Edit 类型只有一个实例,所以只有一个 TreeSet&lt;String&gt;

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

你说:

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

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

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

【讨论】:

  • 我也不知道 ArrayList 来自哪里,抱歉帖子已编辑。
  • @Hexose:好的,我已经删除了那句话。其余的有意义吗?
  • @Jon Skeet 是的,这确实有道理(谢谢),你已经证实了我最初的想法。但让我感到困惑的是,我有一个输入文件,我使用这个单例基本上切碎并输出到不同的文本文件。(帖子中的代码不是我使用的确切代码。)第一次 createList 是调用,我打印出第一个文件。创建第二个文件时,它不包含第一个文件中的任何信息。我认为它应该包含来自基于 TreeSet 在单例类中的第一个文件的信息。
  • @Hexose:目前还不清楚为什么要为此使用单例,但仅根据该描述很难诊断出发生了什么。我建议您创建一个单独的问题,并使用一个简短但完整的示例来演示该问题。
  • 我发现了我的困惑,感谢您提供有用的帖子和跟进。非常感谢。
【解决方案2】:

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

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

如果您有两个实例声明为 Edit 类型(INSTANCE1INSTANCE2;),那么将有两个单独的 TreeSet 实例,每个 INSTANCE 成员都有一个 Edit 类型的成员.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    相关资源
    最近更新 更多