【问题标题】:How do I define a list of constants in Java?如何在 Java 中定义常量列表?
【发布时间】:2013-03-31 15:30:09
【问题描述】:

当我们想定义一个像 pi 这样的常量时,我​​们可以像 public static final float pi = 3.14 那样做。但是可以说我想要一个停用词列表,这些停用词是在扫描一个也会发生变化的文件后生成的。我也可以进行“惰性”初始化吗?你会怎么做?

【问题讨论】:

  • 您能否详细说明一下“但是假设我想要一个停用词列表,这些停用词是在扫描一个也发生变化的文件后生成的”
  • 听起来你想要一个工厂类来生成一个包含常量列表的类。
  • @Lokesh 我正在扫描文件并将单词存储在列表中。但我不想存储“a”、“is”等高频词。所以我将它们保存在一个文件中。但我可以稍后添加到此列表中。所以我想要一个单词列表作为常量,但这将在扫描文件后生成。还是将单词列表称为常量是个坏主意?
  • 因为它不是恒定的:可能。 Java 中的常量(即static final 字段)用于原子的、不可更改的东西。它们的值甚至由编译器内联,因此您需要重新编译使用任何公共常量的每个依赖项。 List 本身(但不是它的内容!)可以被视为一个常数,但它们是发布其价值的更好方法。

标签: java design-patterns constants


【解决方案1】:

您可以使用静态嵌套类来初始化您的常量。

这样做的好处:这个静态嵌套类只有在你使用它时才会被加载,即使你已经使用了包装类。

您只需在嵌套类的构造函数中“扫描”包含停用词的文件,并将它们分配给常量变量,这些变量本身包含在嵌套类中。

注意:我讨厌在处理“复杂”代码(例如扫描某些文件)时使用 静态初始化程序。这会掩盖潜在抛出的异常(在开发期间),因为会抛出 ExceptionInInitializerError ..令人沮丧 ;) http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ExceptionInInitializerError.html

【讨论】:

    【解决方案2】:

    您描述的模式与 Java 常量变量不匹配。你的常量就是数据。

    您可以使用映射 (HashMap<String>) 并使用高频词的值对其进行初始化。
    然后,当您从文件/文本/扫描仪中读取单词时,您会检查该单词是否在地图中并决定要做什么。

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 2014-06-29
      • 2015-05-20
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 2021-12-25
      相关资源
      最近更新 更多