Java 使用枚举实现实用程序类和单例

Java 使用枚举实现实用程序类和单例,java,enums,Java,Enums,在他的博客上写了一些关于 首先,我没有忘记——我甚至没有意识到:) 这些方法很好而且简洁-与实现相同功能的更传统的方法相比,例如使用final类和private构造函数作为实用程序类,除了简洁之外还有什么好处 另外,还有什么问题吗(除了让不期望它的程序员感到困惑之外)?对我来说,使用枚举进行真正的枚举似乎更直观。我不喜欢这种方法。枚举应该保持简单的枚举。它们最多应该包含转换逻辑。将枚举用作单例或接口在我看来就像是一个模糊的代码。除了对非枚举的对象使用枚举的模糊问题外,对单例使用枚举与硬编码单例作

在他的博客上写了一些关于

首先,我没有忘记——我甚至没有意识到:)

这些方法很好而且简洁-与实现相同功能的更传统的方法相比,例如使用
final
类和
private
构造函数作为实用程序类,除了简洁之外还有什么好处


另外,还有什么问题吗(除了让不期望它的程序员感到困惑之外)?

对我来说,使用
枚举
进行真正的枚举似乎更直观。

我不喜欢这种方法。枚举应该保持简单的枚举。它们最多应该包含转换逻辑。将枚举用作单例或接口在我看来就像是一个模糊的代码。

除了对非枚举的对象使用枚举的模糊问题外,对单例使用枚举与硬编码单例作用域的其他方法具有相同的缺点,基本上,它会阻碍测试,并使继承或其他扩展变得困难。让singleton范围由工厂控制是一个更好的主意,就像在Spring一样。

我不太同意那篇文章中第一次使用
enum
。如果您想要一个不可实例化的实用程序类,只需给它一个私有构造函数。就这么简单,
enum
在我看到的那种情况下没有提供额外的好处

在实用程序类中为单例使用枚举是很好的,但我通常会尽量保持这样一个事实,即使用
enum
是一个内部实现细节。例如,请参见Guava的类,它使用
enum
强制执行某些
谓词的单个实例,如
alwaysTrue()
。但它不会向用户公开
enum


至于其他好处:是的,还有其他好处,比如内置的可序列化性和绝对强制每个类加载器一个
enum
常量的单个实例,即使在反序列化时也是如此。

在这两种情况下,我的第一直觉是它们都是令人讨厌的黑客

然而,对于单例,我认为您可以合理地争辩说,在枚举常量是第一类对象的语言中,单例和只有一个值的枚举在概念上没有区别。我仍然不确定我是否真的会使用这种技术,特别是因为单例模式由于其他原因非常不受欢迎


对实用程序类使用枚举更难维护。在概念上,没有理由将一组实用方法表示为枚举(可以说,没有理由将它们表示为类,但这是另一场争论)。用这种方式实现实用方法的唯一理由似乎是通过忽略已建立的约定来节省一点输入。

没有理由不这样做,并在其他情况下使用它们,因为它们同样有益。@ColinD-我认为这不是直观的。当我看到一个枚举时,我希望看到一组颜色、状态等。@Brian:这可能不完全是直观的,但枚举单例模式至少是阅读有效Java的任何人都应该知道和识别的模式(实际上,每个人都应该阅读它)。不过,正如我在回答中提到的,我不喜欢链接文章中的第一次使用,我认为将枚举单例作为类不向用户公开的内部细节通常是一个好主意。你写道:“它可能不完全是直观的”,这是真的。您可以使用简单直观的最佳实践,而不需要枚举。那么我为什么要误用它呢?@ColinD aaah,所以它在更新的有效Java中-我还没有读过!当然,对于服务之类的,这是正确的,但是对于其他类型的单例,使用
enum
可能是一个好主意。@Falcon:我不同意enum需要“简单”,或者最多应该包含转换逻辑。举个例子,枚举很好,用于为某个对象建模一组可能的状态,让每个状态常量都有自己的一组特定于状态的抽象方法的实现是很有意义的。这显然是对枚举的滥用,而枚举只是一个枚举。这并没有什么好处,只是一个值得wtf去混淆的问题。@Falcon:在你看来,这是一个“明显的误用”。出于某种原因,Java使枚举成为完整的类,而不是美化的字符串常量。Josh Bloch建议在有效的Java中使用enum单例,并引用了它们相对于实现单例的传统方法的诸多优势。不管您喜欢与否,Java中的枚举是一种用于创建具有固定实例集的类的构造。。。不仅仅是简单的无行为枚举。@Falcon:“某本书中的某个人”。。。好的!您似乎只是对枚举必须是什么有一些固定的想法,并且不愿意接受这样一个事实,即Java枚举比您认为的要强大得多。与枚举常量相关联的代码可能会让您感到“困惑”,但我所知道的大多数Java开发人员都能很好地理解它。@Falcon:如果有与枚举常量相关联的行为,对于可维护性和干净的代码来说,最好直接将该行为与常量关联,而不是在枚举上或代码中的其他地方执行
开关。在我看来。无论如何,这显然有点太热了所以。。。我只想在这里同意不同意见。相关:对于那些被否决的选民,我很想知道为什么这个问题被否决了。这不是关于如何“以错误的方式”做事的第一个问题,同时,事实证明,Java的《圣经》(有效Java)实际上至少在单身人士的情况下推荐了这种方法。我相信人们会问我为什么接受这篇文章而不是其他文章——这实际上是因为一条评论