我在Java中定义字符串常量的看法是,当在多个地方使用相同的字符串时,应该定义一个字符串常量。这有助于减少拼写错误,减少将来更改字符串的工作量等。
但是如何在一个地方使用字符串。我们应该在这种情况下声明字符串常量。
例如。记录一些计数器(随机例子)。
CounterLogger.addCounter("Method.Requested" , 1)
答案 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)
我看到它的方式,字符串可以用两种方式之一:
我认为很容易看出在两种情况下避免硬编码都很重要。
第一种字符串必须(如果可能)存储为常量,并暴露给可能用于输入/输出的任何程序组件。
显示的字符串(就像在Logger中一样)是您可能在将来某处更改的字符串。将它们全部存储为常量专用类中的static final
字段可以使后续修改更容易,并有助于避免重复类似的按摩。
关于优化问题 - 正如其他人已经回答的那样,我认为没有显着差异。