用于在Java中定义字符串常量的编程实践

时间:2013-12-25 07:03:11

标签: java string constants

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

但是如何在一个地方使用字符串。我们应该在这种情况下声明字符串常量。

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

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

4 个答案:

答案 0 :(得分:2)

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

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

方法参数"Method.Requested"非常自我描述,但1不会使这个常量会使这个例子更具可读性。

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

答案 1 :(得分:1)

据推测,您需要为包含该行代码的任何方法编写单元测试。该单元测试需要访问该String值。如果你不使用常数,你将String重复两次,如果你将来必须改变它,你将不得不在两个地方都改变它。

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

答案 2 :(得分:1)

在我看来你的情况很好。如果你认为将它宣布为常数不会有任何好处。为了支持这一点,请看一下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-";

Iterestingly,这一行

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

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

答案 3 :(得分:1)

我看到它的方式,字符串可以用两种方式之一:

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

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

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

    显示的字符串(就像在Logger中一样)是您可能在将来某处更改的字符串。将它们全部存储为常量专用类中的static final字段可以使后续修改更容易,并有助于避免重复类似的按摩。

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