【问题标题】:enum and singletons - top level vs nested enum枚举和单例 - 顶级与嵌套枚举
【发布时间】:2012-10-14 14:17:56
【问题描述】:

众所周知,在 java 中创建单例的推荐方法是通过枚举(参见例如 here

但是(例如在这个answer 中)它似乎被认为(@MikeAdler 在 cmets 中回复我)拥有枚举 是正确的strong> 单例类(参见例如here 的完整示例,或下面给出的代码)。我似乎并不真正理解这个的需要/用途 - 有人可以详细说明(最好给出这个成语的正确方言)吗?

public class Enclosing {

    private  Enclosing() {}

    static enum Singleton {
        INSTANCE;

        private static final Enclosing  singleton = new Enclosing();

        public Enclosing getSingleton() {
            return singleton;
        }
    }
}

编辑:可以通过Enclosing.Singleton.INSTANCE.getSingleton();获得单身人士

【问题讨论】:

  • 如果你想要一个单例类,而不是单例枚举。
  • @DaveNewton:你能详细说明一下答案吗?我提醒你,枚举是特殊的类——无论如何,单例将是某个类的一个实例。 “单例类”是什么意思?
  • 如果您需要或拥有一个特定的类,并且希望它是一个单例,这是实现它的最简单方法之一。我真的不需要提醒什么是枚举,但是谢谢。
  • @DaveNewton 哦,别误会我的意思 :) 说我是在提醒自己 :D - 我仍然没有真正理解差异 - 为什么不创建这样的类而不是作为顶级枚举?
  • 我告诉过你——如果你已经有,或者出于某种原因特别需要一个给定的类,并且你不想要一个枚举。

标签: java enums singleton


【解决方案1】:

当你想执行 lazy-loading 时,你会嵌套一个 Singleton,比如出于测试原因:

public class Singleton {
    public Enclosing getInstance() {
        return SingletonHolder.INSTANCE;
    }

    static enum SingletonHolder {
        INSTANCE;
    }
}

在此处了解更多信息:http://en.wikipedia.org/wiki/Initialization_on_demand_holder_idiom

【讨论】:

  • 有道理 - 你能详细说明一下机制吗?正如我从您的代码中看到的那样,当第一次加载 Singleton 类时将创建单例,而顶级枚举将在应用程序加载时创建实例?
  • 为什么这比使用普通的旧枚举更好?我不这么认为。
  • @Nim :导致枚举单例仅在需要时/如果需要时创建(我猜 - 不确定类加载器如何工作)
  • 假设 SingletonHolder 有需要很长时间的静态初始化。如果我想在不经过初始化的情况下调用 Singleton 上的其他静态方法,我可以。如果我想注入不同的 SingletonHolder INSTANCE 进行单元测试,这可能很有用。
  • 我看不出静态初始化器的相关性。您可以在没有新实例的情况下调用枚举的静态方法,如果您愿意,也可以注入不同的枚举。我根本没有从您的代码中获益。
【解决方案2】:
public enum Foo {
   INSTANCE;
}

是在 Java 5 后获得单例的最简单和最好的方法。您发布的代码只是不必要地复杂,我认为它与仅使用枚举相比没有任何优势。

【讨论】:

  • 是的,我知道 - 我想知道将这个枚举声明为 nested 的特殊习惯用法
  • @Mr_and_Mrs_D 这对我来说看起来很乱。
  • 它可能会被使用,并且可能有一些用途 - 这就是我问的原因:)
猜你喜欢
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多