【问题标题】:Why method parameters needs to be set as final?为什么方法参数需要设置为final?
【发布时间】:2010-09-03 12:48:41
【问题描述】:

我为我的项目启用了 Checkstyle。它在方法参数上显示黄色标记并请求将其设置为final。为什么?什么目的?如果不指定会有什么问题?

【问题讨论】:

  • 您使用的语言和平台等小细节会很方便。
  • Checkstyle 等工具应被视为构建团队认为良好形式的建议或起点。我已经看到团队浪费了大量时间来回答静态分析工具的每一个感知缺陷,而没有投入任何真正的人类思考。话虽这么说,@Balazs 对于问题的一般“为什么要这样做”部分有一个很好的答案。

标签: java checkstyle


【解决方案1】:

如果Checkstyle中有规则,通常答案也在那里:http://checkstyle.sourceforge.net/config_misc.html

在这种情况下:

在方法的算法执行期间更改参数的值可能会造成混淆,应该避免。让 Java 编译器阻止这种编码风格的一个好方法是将参数声明为 final。

【讨论】:

  • 在将方法参数标记为final时,它们不是为了序列化目的而复制到对象中吗?
  • 方法参数就像局部变量。它们与对象序列化无关。或者我误解了你的问题。
  • 是的,但是如果要在方法中定义的匿名类中使用局部变量,则必须将其标记为final。这会将变量复制到对象(可以从匿名类访问),并且作为副作用,它会与对象一起序列化。
  • 你说得对,匿名类中只能使用常量变量。但我认为这个问题不属于这里,因为这个主题更多的是关于代码格式和编码约定。你要找的话题是stackoverflow.com/questions/4732544/…
  • 你确定序列化已经完成了吗?如果有一个匿名类,则创建的变量与从外部使用的变量一样多。它们通过隐藏的构造函数传递。只传递指针,没有序列化或反序列化。并非所有最终变量都被传递,而只有匿名类中使用的变量。您可以使用具有两个 AtomicInteger 变量的 simpla 应用程序来尝试它,并且在匿名类中只使用其中一个。在调试器中,您将看到未使用的变量没有被视为成员变量。
【解决方案2】:

从您的 CheckStyle 声明中删除 FinalParameters。 http://checkstyle.sourceforge.net/config_misc.html#FinalParameters

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 2011-03-23
    • 2020-09-02
    • 1970-01-01
    • 2014-01-14
    • 2012-09-02
    • 2018-07-22
    相关资源
    最近更新 更多