摆脱Java中的魔术数字

时间:2013-10-07 02:28:04

标签: java magic-numbers

如何在不宣布大量决赛或静态决赛的情况下摆脱java中的魔术数字?请记住循环,不允许使用数组。这似乎不可能?帮助赞赏。感谢。

示例代码:

drawOval(5, 5, width, height);
drawOval(10, 10, width, height);
drawOval(15, 15, width, height);
drawOval(20, 20, width, height);
drawOval(25, 25, width, height);

3 个答案:

答案 0 :(得分:6)

定义常量是您唯一的选择。你反对使用它们是什么?在这种情况下,他们绝对值得他们的空间。未来的开发人员更愿意看到额外的常数而不是被这些数字的含义所迷惑。

答案 1 :(得分:2)

直接的答案是命名常量是避免在代码中使用幻数的唯一方法。


但另一方面,它是有争议的魔术数字是否有害(或者它们是有害的)。在这个特殊情况下,这些实际上是否真的有资格作为“魔术”数字是有争议的......至少,IMO。

让我们说明一下:

// Alternative #1

private final int PLACE_1_X = 5;
private final int PLACE_1_Y = 5;
...
drawOval(PLACE_1_X, PLACE_1_Y, width, height);

// Alternative #2
drawOval(5, 5, width, height);

其中哪些实际上更具可读性?定义命名常量(最有可能在源代码中的不同点!)使得更容易理解发生了什么?难道你现在遇到的问题是你必须在两个地方看一下才能了解特定的drawOval电话将要绘制的内容吗?


最重要的是,“没有神奇数字”的教条只有当数字的含义在上下文中不明显时才真正适用......或者当数字实际上是重复使用时不变。 (就像我们要在同一个“图片”中多次使用PLACE_1一样。)

你需要考虑上下文,而不是盲目地应用教条。

答案 2 :(得分:1)

我已经看到的终结/静态的替代方法是使用自定义对象作为参数:

public void drawOval(OvalArg arg) {
    // ...
}

OvalArg arg = new OvalArg();
arg.first = 10;
arg.second = 10;
arg.width = 100;
arg.height = 500;

drawOval(arg);

但是,这种方法意味着您无法直接查看必须将哪些参数发送到方法(除非您查看参数对象),并且需要额外的验证以确保正确填充自定义对象。出于这个原因,我建议使用常量。