java - 这种方法有什么问题吗?

标签 java string coding-style constants

新的代码审查流程已经到位,现在我的团队不得将字符串声明为局部变量,否则提交将无法通过代码审查。我们现在改用常量。

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

String operationId = "create"; 

应该使用以下内容:

private static final String OPERATION_ID = "create";

虽然我完全同意对代码中出现+2次的字符串使用常量...但我发现如果只使用一次字符串,则完全无法声明该字符串,这有点过分了。

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

  • 字符串 div = "div1";
  • Catch(Exception ex){ LOGGER.log("csv 文件已损坏") }
  • 字符串连接 String str = "something ...."+ someVar + "something" ...我们将 someVar 替换为 %s,将整个事物声明为全局字符串,然后使用 String.format(....)

  • if( name.equals("奥迪"){....}

  • 字符串值 = map.get("key")

大家有什么想法吗?我想要一些强有力的论据。我准备好接受任何有充分论据支持的立场。

谢谢。

最佳答案

首先,让我们放弃您的假设:所描述的方法本质上没有错误

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

private static final String OPERATION_ID = "create";

真的,这在其他任何地方都没有使用过吗?如果我将其更改为字符串“beetlejuice”,不会有任何问题?如果某些东西会损坏,那么其他东西正在使用这个常量...如果“其他东西”碰巧是不同语言的代码库,这就是为什么它们不共享字符串常量 - 这是异常(exception),而不是规则。一致性!

<小时/>

也就是说,我会以稍微不同的方式标准化一些东西,但我仍然会标准化它们:

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

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

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

此外,我不会在任何地方使用此模式,因为它会破坏 IDE 警告您丢失字符串的能力 - 例如,从 .properties 文件中查找字符串。当您在 .properties 文件中查找不存在的键时,许多 IDE 都会向您发出适当的警告,但额外的间接级别可能会破坏这种警告,具体取决于您的 IDE 的智能程度。

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

这对我来说有点灰色地带 - 这是一条仅供内部使用的消息吗?这些日志是否只有您(开发人员)才能看到,还是也为了用户的利益?

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

如果您确实希望用户查看日志,那么应该将它们外部化到 .properties 文件中。

关于java - 这种方法有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36632760/

相关文章:

java - 栈为空时pop抛出什么异常

java - 将 MySQL 连接到 Spring 应用程序

java - 使用环境变量作为 CATALINA_HOME 的属性占位符

java - 开始时的其他 Activity

使用指向 uint64_t 的指针复制 C 中的自定义字符串会导致段错误

c# - 将 (0/1) 字符串加载到位数组中

c# - boolean getter/setter 方法和属性的语法

android:自定义 CursorAdapter 中的样式 ListView 项目

django - 更改vim缩进格式

安卓动态字符串 : %1d vs %1$d