多个枚举与一个枚举

Jur*_*uru 7 java enums reactive-streams

当我偶然发现一些我不明白为什么这样做的事情时,我正在查看反应流规范的Publisher(AsyncIterablePublisher.java)的示例实现.

static interface Signal {};
enum Cancel implements Signal { Instance; };
enum Subscribe implements Signal { Instance; };
enum Send implements Signal { Instance; };
Run Code Online (Sandbox Code Playgroud)

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

enum Signal {
  Cancel,
  Subscribe,
  Send;
}
Run Code Online (Sandbox Code Playgroud)

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

Jur*_*uru 0

因此,由于我不知道要批准哪个答案,所以我给这段代码的作者发了邮件,询问他的想法。这是对话(块来自他。普通文本是我的):

嗨迈克尔,

那么与只有一个枚举有什么区别呢?你不会有三个单例,但仍然有三个唯一定义的对象。:

当然,这是可以做到的,但是我必须为它发明一个名称(例如 ConcreteSignal),我选择的编码避免了这种情况:)

enum Signal {
  Cancel, Subscribe, Send;
}
Run Code Online (Sandbox Code Playgroud)

我认为这也是线程安全的,如果您确实想要拥有共享接口,例如可以与对象共享,您可以这样做:

enum ConcreteSignal implements Signal {
  Cancel,
  Subscribe,
  Send;
}
Run Code Online (Sandbox Code Playgroud)

你绝对可以像上面那样做,但是我认为它们[取消、订阅、发送]并不比请求更具体(这也是一个信号): https: //github.com/reactive-streams/反应流-jvm/blob/v1.0.0/examples/src/main/java/org/reactivestreams/example/unicast/AsyncIterablePublisher.java#L49

此外,这也可能鼓励使用 Enum 的方法来枚举所有可能的信号,但它不能,因为请求不是信号。说得通?

事实上,在 Scala 中,您宁愿使用对象来完成此操作,但在 Java 中,很少看到像您的实现这样的东西。我只是好奇我错过了 Java 中的一些巧妙的功能。但如果我理解正确的话,那是因为您对该实现更满意,因为它更接近您的首选语言 Scala?

我想这其中有一点,但是 Java 中的单例作为枚举模式是众所周知的,所以唯一“奇怪”的事情是为每个 Cancel、Subscribe 和 都有一个不同的“enum”发送,但正如我之前所解释的,由于请求无法像这样进行编码,所以我选择了更“Scala-y”的版本。

因此,如果“请求”不需要任何参数,我会按照您的建议完成: enum Signal { Cancel, Request, Subscribe, Send }

谜团已揭开 :-)。