使用幻数(1)或全局常量检查列表大小?

use*_*453 3 java design-patterns

我和同事讨论以下代码:

private static final byte ONE_ELEMENT = 1;
private boolean isListSizeEqualsOne(List<MyClass> myList) {
    return myList.size() == ONE_ELEMENT;
}
Run Code Online (Sandbox Code Playgroud)

我认为这种代码无疑会减少对一个神奇数字的警告,但同时会不必要地增加混乱.我建议改为内联全局变量:

private boolean isListSizeEqualsOne(List<MyClass> myList) {
    return myList.size() == 1;
}
Run Code Online (Sandbox Code Playgroud)

有没有关于这个例子的文献?

sle*_*ske 6

我认为代码的问题已经在方法本身.就像注释一样,方法名称不应该表明代码的作用,而是为什么.换句话说,它应该表明它提供的功能,而不是它的实现.

也就是说,它应该表达该方法在系统中扮演的角色.所以不要isListSizeEqualsOne使用名称,而是使用表示"为什么"的名称.例如resultIsUnique,或errorReturned(如果使用API​​,其中包含单个元素的列表指示错误).

然后,常量的命名如下:

  • resultIsUnique: 不变 UNIQUE_RESULT_COUNT=1
  • errorReturned: 不变 ERROR_RESULT_COUNT=1

最后,我不认为为内联常量启用警告是个好主意.对数字使用命名常量只有合理才有意义

  1. 每个地方的值必须相同(例如文件格式的幻数),或者
  2. 值需要一个明显的名称,例如数学常量

如果你需要其含义明显的常量(例如通过将大小与零进行比较来检查空列表),那么我认为一个简单的内联值是完全可以的.