Java枚举单例的注释

时间:2013-03-23 23:22:52

标签: enums annotations singleton java

正如Bloch在 Effective Java 2nd Edition 的第3项(“使用私有构造函数或枚举类型实施单例属性”)中所述,单元素枚举类型是最好的实现单身人士的方式。不幸的是,旧的私有构造函数模式仍然非常普遍和根深蒂固,以至于许多开发人员在创建枚举单例时并不理解我在做什么。

类声明之上的简单// Enum Singleton注释有所帮助,但它仍然留下了另一个程序员可以稍后出现并向枚举添加第二个常量,打破单例属性的可能性。对于私有构造函数方法存在的所有问题,在我看来,它比枚举单例更加自我记录。

我认为我需要的是一个注释,它既声明枚举类型是单例,并且在编译时确保只有一个常量被添加到枚举中。像这样:

@EnumSingleton // Annotation complains if > 1 enum element on EnumSingleton
public enum EnumSingleton {
   INSTANCE;
}

有没有人在任何地方的公共图书馆中为标准Java运行这样的注释?或者是我在Java当前的注释系统中要求不可能的东西?

更新

我正在使用的一种解决方法,至少在我决定真正打扰我自己的注释之前,就是将@SuppressWarnings("UnusedDeclaration")直接放在INSTANCE字段的前面。它使得代码看起来与简单的枚举类型截然不同。

2 个答案:

答案 0 :(得分:3)

你可以使用这样的东西 -

public class SingletonClass {
    private SingletonClass() {
        // block external instantiation
    }

    public static enum SingletonFactory {
        INSTANCE {
            public SingletonClass getInstance() {
                return instance;
            }
        };

        private static SingletonClass instance = new SingletonClass();
        private SingletonFactory() {
        }

        public abstract SingletonClass getInstance();
    }
}

您可以在其他课程中访问 -

SingletonClass.SingletonFactory.INSTANCE.getInstance();

答案 1 :(得分:2)

我不知道公共java库中有这样的注释,但是您可以自己定义这样的编译时注释以用于您的项目。当然,您需要为它编写注释处理器并以某种方式调用APT(使用antmaven)以在编译时检查您的@EnumSingleton带注释的枚举结构

以下是有关如何编写和使用compile time annotations的资源。