Java 5+中的静态字符串常量VS枚举

时间:2009-12-07 09:28:04

标签: java enums constants

我读过这个问题&答案: What is the best way to implement constants in Java?

并提出了一个决定,即枚举是实现一组常量的更好方法。 另外,我在Sun网站上阅读了一个如何将行为添加到枚举的示例(请参阅前面提到的帖子中的链接)。 因此,使用String键将构造函数添加到枚举中以保存一堆String值没有问题。

这里的唯一问题是我们需要添加“.nameOfProperty”来访问String值。 所以代码中的每个地方我们都需要通过它的名称(EnumName.MY_CONSTANT)来解决常量值,但是就像那样(Enum.MY_CONSTANT.propertyName)。

我在这儿吗?你觉得怎么样?

2 个答案:

答案 0 :(得分:25)

是的,命名可能看起来有点长。但没有人能想象的那么多......

  1. 因为枚举类已经给出了一些上下文(“这是什么常量集合?”),实例名称通常比常量名称短(强类型已经与其他枚举中类似的命名实例区分开来。)

  2. 此外,您可以使用静态导入来进一步缩短长度。你不应该在任何地方使用它,以避免混淆,但我觉得与枚举密切相关的代码可以很好用。

  3. 在枚举上的开关中,您不使用类名。 (在Java 7之前的字符串上甚至不能切换。)

  4. 在枚举类本身中,您使用短名称。

  5. 因为枚举有方法,许多会大量使用常量的低级代码可以从业务代码迁移到枚举类本身(动态或静态方法)。正如我们所看到的,将代码迁移到枚举会进一步减少长名称的使用。

  6. 常量通常以组的形式处理,例如if用六个常数之一测试相等性,或者另外四个等等。枚举配有EnumSets {{1}方法(或类似的返回适当组的动态方法),允许您将组视为一个组(作为次要优势,请注意这两个分组实现非常快 - O(1) - 内存不足!)。

  7. 有了所有这些要点,我发现实际代码要短得多

答案 1 :(得分:7)

关于常量的问题 - 枚举应该表示所有相同类型的常量。如果您正在执行任意常量,这是错误的方法,原因是在其他问题中描述的原因。

如果你想要的只是字符串常量,关于详细代码你是对的。但是,您可以覆盖toString()方法返回属性的名称。如果您只想将String连接到其他字符串,那么这将为您的代码节省一些额外的详细程度。

但是,您是否考虑过使用属性文件或其他一些国际化方法?通常在定义Strings的dets时,它用于用户界面消息,并将这些消息提取到单独的文件可能会为您节省大量的未来工作,并使翻译更容易。