【问题标题】:Programming practice for defining string constants in JavaJava中定义字符串常量的编程实践
【发布时间】:2014-01-13 05:37:18
【问题描述】:

我对在 Java 中定义字符串常量的看法是,当在多个地方使用同一个字符串时,应该定义一个字符串常量。这有助于减少拼写错误,减少将来更改字符串等的工作量。

但是在一个地方使用的字符串怎么样。即使在这种情况下,我们是否应该声明字符串常量。

例如。记录一些计数器(随机示例)。

CounterLogger.addCounter("Method.Requested" , 1)
  • 声明常量而不是使用原始字符串有什么好处吗?
  • 编译器是否进行任何优化?

【问题讨论】:

  • 不,不……
  • 无论字符串文字出现多少个类或Jars,JVM都会合并字符串文字池中使用的所有字符串文字。
  • 不,不...除了国际化
  • 如果您将字符串定义为常量(可能在单独的类中或将它们存储在特殊文件中),查找和编辑它们会更容易。有时非常容易。
  • 虽然跑题了,但我觉得this link值得一提。

标签: java string constants


【解决方案1】:

声明常量可以改进您的代码,因为它们可以更具描述性。在你的例子中

CounterLogger.addCounter("Method.Requested" , 1)

方法参数"Method.Requested" 是非常自我描述的,但1 没有将其设为常量将使此示例更具可读性。

CounterLogger.addCounter("Method.Requested" , INITIAL_VALUE)

【讨论】:

    【解决方案2】:

    在我看来,字符串可以通过以下两种方式之一使用:

  • 作为属性/键/枚举 - 或者换句话说,作为应用程序的另一个对象/状态的内部表示,其中一个代码组件编写它们,另一个代码组件读取它们。
  • 在 UI 中 - 用于 GUI/控制台/日志显示目的。

    我认为很容易看出在这两种情况下避免硬编码的重要性。

    第一种字符串必须(如果可能)存储为常量,并暴露给可能使用它们进行输入/输出的任何程序组件。

    显示的字符串(例如在您的 Logger 案例中)是您将来可能会更改的字符串。将它们全部存储为常量专用类中的static final 字段可以使以后的修改更容易,并有助于避免类似消息的重复。

    关于优化问题 - 正如其他人已经回答的那样,我相信没有显着差异。

  • 【讨论】:

      【解决方案3】:

      大概,您会想要为包含该行代码的任何方法编写一个单元测试。该单元测试将需要访问该String 值。如果您不使用常量,则String 将重复两次,如果您以后必须更改它,则必须在两个地方都进行更改。

      所以最好使用常量,即使编译器不会做任何有用的优化。

      【讨论】:

      • 我不同意。单元测试应该只知道要使用的字符串常量,如果它是正在测试的方法的参数。在这种情况下,单元测试需要明确说明要使用的字符串值。如果有人去实现类并更改了常量,则测试应该中断并迫使开发人员检查并更新它们以确认该类的接口现在正在更改。
      【解决方案4】:

      在我看来,你的情况很好。如果您看不到将其声明为常量的任何优势,请不要这样做。为了支持这一点,看看 Spring JdbcTemplate(我毫不怀疑 Spring 代码是一个很好的例子)它充满了像这样的字符串文字

      Assert.notNull(psc, "PreparedStatementCreator must not be null");
      Assert.notNull(action, "Callback object must not be null");
      throw getExceptionTranslator().translate("StatementCallback", getSql(action), ex);
      

      但只有两个常量

      private static final String RETURN_RESULT_SET_PREFIX = "#result-set-";
      private static final String RETURN_UPDATE_COUNT_PREFIX = "#update-count-";
      

      有趣的是,这一行

      Assert.notNull(sql, "SQL must not be null");
      

      在代码中重复 5 次,但作者拒绝将其设为常量

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-27
        • 2018-11-17
        • 2013-02-24
        • 1970-01-01
        • 1970-01-01
        • 2014-02-06
        • 2012-02-03
        • 1970-01-01
        相关资源
        最近更新 更多