java – 多个枚举与一个枚举

当我偶然发现一些我不明白为什么这样做的事情时,我正在查看反应流规范的Publisher( AsyncIterablePublisher.java)的示例实现.
static interface Signal {};
enum Cancel implements Signal { Instance; };
enum Subscribe implements Signal { Instance; };
enum Send implements Signal { Instance; };

说实话,我不是这样一个高级程序员,而是写这个的人,我确信有理由这样做.但是我也无法解释为什么它会比这更好(这就是我会做到的).

enum Signal {
  Cancel,Subscribe,Send;
}

有人可以向我解释为什么会更好吗?优点缺点?

解决方法

不要太严格,这里是我对这段代码的解释.让我们称之为反应流Roland的所有者.

起初,Roland需要所有入站信号的通用接口

static interface Signal {};

ConcurrentLinkedQueue<Signal> inboundSignals = new ConcurrentLinkedQueue<Signal>();

像取消,订阅和发送这样的信号总是有相同的目的是不可变的并且经常发生,所以将它们实现为Joshua Bloch’s Singleton是好主意:

enum Cancel    implements Signal { Instance; };
enum Subscribe implements Signal { Instance; };
enum Send      implements Signal { Instance; };

另一种方法是做同样的建议和我的最爱:

enum CommonSignals implements Signal{

    Cancel {
        @Override
        void debug() {
            System.out.println("Cancel");
        }
    },Subscribe {
        @Override
        void debug() {
            System.out.println("Subscribe");
        }
    },Send {
        @Override
        void debug() {
            System.out.println("Send");
        }
    };

    abstract void debug();

    [...] some other methods I Could need in the future
}

如您所见,这是一种不同的实现.但这个想法是一样的 – 信号单身

我们继续前进并找到此代码

static final class Request implements Signal {
    final long n;
    Request(final long n) { // every Request has different value of n
        this.n = n;
    }
};

由于inboundSignals可以包含多个Request对象,因此无法将此类型的Signal实现为Singleton.因此,它不能是CommonSignals的成员或实现为枚举.

结论

罗兰使用了许多可能性来实现单身人士.我认为这更像是一种品味如何去做.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...