当前位置: 首页 > 面试题库 >

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

狄阳秋
2023-03-14
问题内容

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

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

这里的唯一问题是,我们需要添加“
.nameOfProperty”来访问String值。因此,在代码中的每个地方,我们都不仅需要使用常量名称(EnumName.MY_CONSTANT)来寻址常量值,还需要使用常量名称(Enum.MY_CONSTANT.propertyName)。

我在这里吗?你怎么看呢?


问题答案:

是的,命名似乎有点长。但是没有想象中的那么多…

  1. 因为enum类已经给出了一些上下文( “这属于哪个常数集?” ), 所以实例名称通常比常数名称短 (强类型已与其他枚举中的相似命名实例区分开)。

  2. 另外,您可以 使用静态导入 来进一步减少长度。您不应在各处使用它,以免造成混淆,但我认为与枚举紧密关联的代码可以使用。

  3. 在枚举上的 开关中 ,您不使用类名。(在Java 7之前的Strings上甚至无法进行切换。)

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

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

  6. 常量通常按组进行处理,例如if用6个常量之一或其他四个常量进行相等性测试。枚举配EnumSets有一种contains方法(或类似的返回适当组的动态方法),使您可以 处理一个组作为一个组 (作为第二个优点,请注意,这两种实现分组的速度非常快-O(1)-内存很低!)。

综合以上几点, 我发现实际代码要短得多



 类似资料:
  • 问题内容: 我正在查看公司其他部门维护的一些Java代码,顺便说一下,这是一些前C和C ++开发人员所维护的。普遍存在的一件事是使用静态整数常量,例如 除了缺少“最终”限定符外,这种代码也让我有些不安。我本来希望看到的是,从学校开始主要接受Java的培训,这会更像 但是,论点使我失望。为什么要比后者更好呢? 问题答案: 为什么要比后者更好呢? 这样做要好得多,因为它可以为您提供类型安全性并具有自记

  • 我用一些字符串作为属性的常量创建了一个枚举。每个常数中字符串的数量都不一样,所以我使用了varargs(第一次这样做)。这是我的枚举: 现在我想要能够键入类似的内容:

  • 问题内容: 有什么方法可以在Java枚举声明中定义静态最终变量(有效常量)? 我想要在一个地方定义BAR(1 … n)值的字符串文字值: 对于以上代码,我收到以下错误消息: 在定义字段之前无法引用它 。 问题答案: 正如IntelliJ IDEA建议的那样,在提取常量时-制作静态嵌套类。此方法有效:

  • 问题内容: 在C ++中,创建多行字符串的最佳规范方法是创建相邻字符串,并让编译器在编译时将它们连接起来,如下所示: 在Java中,我唯一知道的方法是串联: 问题是,这是在运行时生成单个字符串,还是Java实际上也在编译时进行连接?出现此问题的原因是由于以下行为: 问题答案: String s3 = “a”; s3 += “bc”; 与: 因此,它创建了一个新实例。 您甚至可以尝试:

  • 因此,进一步寻找,我发现这个人有一个解决方案:typescript中基于字符串的枚举的解决方案 这将允许像这样的东西工作: 唯一的回应基本上是说这样做是不安全的。(但我应该说,它确实起作用了--我可以键入eventtype.dot...Atom editor给了我5个大小写选项可供选择(保持代码中的内容一致),然后我可以使用它将字符串值吐出来,给我的用户一个很好的填充空间的体验,将来我可以更改枚举

  • 问题内容: Java中的静态和非静态枚举有什么区别?两种用法是相同的。 正确吗 所有静态的都在启动时加载到内存中,非静态的则按需加载 ? 如果是,那么哪种方法更好?将某些数据始终保留在内存中还是每次使用服务器资源加载它们? 问题答案: 所有的都是有效的。如果您有嵌套的枚举,则它与相同。 所有类都是延迟加载的(枚举或其他),但是在加载时,它们会一次全部加载。也就是说,您不能加载一些常量,而不能加载其