这种方法有什么问题?

时间:2016-04-14 19:56:03

标签: java string coding-style constants

新的代码审核流程已经到位,现在我的团队不得将字符串声明为本地变量,否则提交将不会通过代码审核。我们现在改为使用常量。

所以这绝对是不允许的,即使我们确定字符串永远不会在任何其他地方使用

String operationId = "create"; 

这应该是应该使用的:

private static final String OPERATION_ID = "create";

虽然我完全同意在代码中出现+2次的字符串使用常量...但我觉得如果它只使用一次就完全没有能够声明字符串的能力。

为了确保清楚,以下所有内容在任何情况下都不允许:

  • String div = "div1";
  • Catch(Exception ex){ LOGGER.log("csv file is corrupt") }
  • 字符串连接String str = "something ...." + someVar + "something" ...我们要用someVar替换%s,将整个事物声明为全局字符串,然后再使用String.format(....) < / p>

  • if( name.equals("Audi" ){....}

  • String value = map.get("key")

任何想法的家伙?我想要一些有力的论据。我已经准备好接受任何有良好争论支持的立场。

感谢。

2 个答案:

答案 0 :(得分:0)

首先,让我们抛弃你的假设:所描述的方法没有任何内在的错误

这不是关于字符串在多个地方使用的问题,而是关于常量易于查找和记录,以及您的代码一致

private static final String OPERATION_ID = "create";

真的,这个在任何地方都没用过吗?如果我将其更改为字符串&#34; beetlejuice&#34;?如果有什么东西会破坏,那么其他东西就会使用这个常数...如果&#34;其他东西&#34;碰巧是不同语言的代码库,这就是他们不共享字符串常量的原因 - 这是例外情况,而不是规则。一致性!

那就是说,有一些事情我会以稍微不同的方式标准化,但我仍然会将它们标准化:

我建议在枚举构造函数中允许使用字符串文字:

public enum Operation {
    CREATE("create"),
    ...
}

因为在这里,枚举是代码中引用的常量,而不是字符串文字。将常量声明为枚举或private static final String等同于我,并且不需要同时执行这两种操作。

此外,我不会在任何地方使用此模式,因为它会破坏您的IDE警告您缺少字符串的能力 - 例如,查找.properties文件中的字符串。当您在.properties文件中查找不存在的密钥时,许多IDE会给您正确的警告,但是额外的间接级别可能会破坏,这取决于IDE的智能程度。

Catch(Exception ex){ LOGGER.log("csv file is corrupt") }

这对我来说有点灰色 - 这只是一个内部消息吗?日志只是您,开发人员才能看到的,还是用户的利益?

如果仅适用于应用程序的开发人员,则可能不需要进行本地化。

如果您希望用户查看日志,则应将它们外部化为.properties文件。

答案 1 :(得分:0)

当多次使用值/ literal时,为值/文字定义常量是一种很好的编码风格。

强加的编码风格强制您为每个字符串文字使用常量。

该编码风格的良好效果是:所有真正应该声明为常量的字符串文字现在都被声明为常量。

该编码风格的错误含义是:您 - 开发人员 - 无法决定是否应将字符串文字定义为常量。这是一个沉重的打击。

因此,您应该提出您的担忧,即编码风格的良好意图不能弥补您的开发人员资格中的不信任。