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

2022-09-01 19:08:18

我已经读过这个问题和答案:在Java中实现常量的最佳方法是什么?

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

这里唯一的问题是,我们需要添加“.nameOfProperty”来访问 String 值。因此,在代码的任何地方,我们不仅需要通过它的名称(EnumName.MY_CONSTANT)来寻址常量值,还需要像这样(Enum.MY_CONSTANT.propertyName)。

我就在这里吗?对此,你怎么看?


答案 1

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

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

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

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

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

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

  6. 常量通常以组的形式处理,例如与六个常量之一或四个常量之一的相等性测试等。枚举配备了一种方法(或类似地返回相应组的动态方法),允许您将组视为组(作为次要优势,请注意,这两种分组实现非常快 - O(1) - 并且内存不足!ifEnumSetscontains

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


答案 2

关于常量的问题 - 枚举应该表示所有相同类型的常量。如果你正在做任意常量,这是错误的方式,原因都在另一个问题中描述。

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

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


推荐