什么是幻数?
为什么要避免?
有合适的情况吗?
幻数是代码中数字的直接用法。
例如,如果您有(在 Java 中):
public class Foo { public void setPassword(String password) { // don't do this if (password.length() > 7) { throw new InvalidArgumentException("password"); } } }
这应该重构为:
public class Foo { public static final int MAX_PASSWORD_SIZE = 7; public void setPassword(String password) { if (password.length() > MAX_PASSWORD_SIZE) { throw new InvalidArgumentException("password"); } } }
它提高了代码的可读性并且更容易维护。想象一下我在 GUI 中设置密码字段大小的情况。如果我使用幻数,每当最大大小发生变化时,我必须在两个代码位置进行更改。如果我忘记了一个,这将导致不一致。
JDK 充满了像 inInteger和classes这样Character的例子。Math
Integer
Character
Math
PS:像 FindBugs 和 PMD 这样的静态分析工具会检测代码中幻数的使用并建议重构。