【问题标题】:CheckStyle with warning '100' is a magic number带有警告“100”的 CheckStyle 是一个神奇的数字
【发布时间】:2015-05-05 05:18:47
【问题描述】:

在我的代码中,它显示警告消息“100”是一个幻数。请参阅下面的代码,

int randomNo = generator.nextInt(100);

我在这里读到了What is a magic number, and why is it bad?,但我怀疑通过使用静态创建变量来声明 100 会占用更多空间,因为我在一个地方使用它。这是解决这个问题的正确方法吗?

  public static final int HUNDRED= 100;

有什么建议吗?

【问题讨论】:

  • 最好这样使用:public static final int MAX_RAND= 100;
  • 我需要它在一个地方还是最好在顶部声明?
  • 我遇到了一个相关的错误,在使用 checkstyle 插件进行 maven 构建时:(coding) MagicNumber: '4' is a magic number. 我发现我可以使用接受的答案中描述的方法避免这些错误(当然添加评论到您刚刚添加的字段)。

标签: java checkstyle


【解决方案1】:

好吧HUNDRED确实有点傻,但是你为什么选择100,它的含义是什么?

类似:

public static final int RANDOM_UPPER_LIMIT=100;

或者更多信息,具体取决于您使用该值的目的:

public static final int MAX_NUMBER_OF_COLORS=100;

会更有意义并提高可读性。

在这种情况下不应该考虑节省空间,声明变量的空间开销(如果有的话)完全可以忽略不计。

【讨论】:

  • 嗨 yurib 谢谢你的建议,我同意选择 HUNDRED var name 是不正确的方法,但在这里我问的问题是创建静态 var 会占用更多空间,
  • @mohammed 在这种情况下不应该考虑节省空间,声明变量的空间开销(如果有的话)完全可以忽略不计
【解决方案2】:

它实际上与存储无关,它与可读性有关。如果您想更改某个数字,在代码中可能很难找到,如果它在顶部则更好(如果它在配置文件中,在许多情况下会更好)。

是的,这是一个很好的解决方案。

如果您不需要在该文件之外使用它,则应将其设为“私有”,并且您可能希望更具可读性并使用能表明其真正含义的名称,例如:

MAX_RANDOM_NUMBER=100

最好包括它的用途

MAX_RANDOM_FOR_CARD_SELECTION

或类似的东西。

以这种方式,当您在 5 个月后查看该文件时,因为您添加了 20 张新卡,您无需看代码就可以完全清楚地知道您必须更改的内容。

【讨论】:

    【解决方案3】:

    最好不要编写最短的代码,而是编写易于理解和维护的代码。将此100 存储为常量,您可以添加一个好名称来解释为什么它真的是100。例如,如果你想生成随机分数并且你的最大可能分数是100,那么你可以定义

    static final int MAX_SCORE = 100;
    

    之后,您也可以在其他地方使用它。每个人都会明白为什么它是 100 而没有别的。如果有一天您需要将其更改为 200,则只需在一个地方替换它,而无需搜索代码。

    也有可能在你的程序的其他部分你会有 100 个不同的含义(比如,MAX_PERCENT)。如果您想将 MAX_SCORE 更改为 200,但将 MAX_PERCENT 保持原样,如果您有单独的常量会容易得多。

    【讨论】:

    • 是的..我明白,但我需要它在一个地方,我的应用程序中有 50 个其他幻数。它会占用额外的存储空间吗?wht ab 性能?
    • 在运行时不会有任何开销,因为 java 编译器会直接替换代码中使用它们的数字(前提是您将它​​们声明为 static final)。您编译的应用程序大小会增加一点,但没关系。
    【解决方案4】:

    看看罗伯特·马丁(鲍勃叔叔)

    干净的代码

    书籍以获得详尽的解释(或任何其他关于编码风格的指南)。基本上,硬编码的“100”对代码的读者没有任何意义。在您完成应用程序后的 6 个月内,这对您也没有任何意义。这是一个神奇的数字,因为它出现在代码中 - 在 100 个案例中有 99 个 - 几乎无处不在。为什么是 100 而不是 99 或 101?为什么您的应用程序应将随机数生成限制为 100 而不是高于(或低于)?

    总而言之,对于您自己以及对于您的代码的现在或未来的读者来说,代码的可读性是一个问题,这是一个编码风格的问题。

    【讨论】:

    • PreparedStatement的情况下设置参数索引怎么办?
    • 正是我的情况
    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2019-08-24
    • 1970-01-01
    • 2013-06-20
    • 2014-11-25
    相关资源
    最近更新 更多