当我偶然发现一些我不明白为什么这样做的事情时,我正在查看反应流规范的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的成员或实现为枚举.
结论
罗兰使用了许多可能性来实现单身人士.我认为这更像是一种品味如何去做.