8

正如 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它在使代码看起来与简单的枚举类型不同方面做得不错。

4

2 回答 2

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();
于 2013-03-23T23:43:26.143 回答
2

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

这是有关如何编写和使用编译时注释的资源。

于 2013-03-23T23:52:49.140 回答