【问题标题】:netbeans warning: Method is declared finalnetbeans 警告:方法被声明为最终方法
【发布时间】:2015-07-18 05:17:22
【问题描述】:

我正试图摆脱代码中的所有警告,今晚我注意到来自 Netbeans 的这个警告(不是编译器警告)。拿这个代码:

class A {
    public Void method1() {
        return null;
    }

    public final Void method2() {
        return null;
    }
}

method2()Netbeans 说:

方法method2被声明为final

但这有什么问题呢?在该类的实现中,它按预期工作:

class SubA extends A {
    @Override
    public Void method1() {
        return super.method1();
    }

    @Override
    public Void method2() { // <---- this throws an error
        return super.method2();
    }
}

那么为什么 Netbeans 会抱怨呢?

注意:我知道我可以关闭警告(并且我知道如何关闭),但我想知道它背后的逻辑(如果有的话)。

【问题讨论】:

  • 不能覆盖final 方法>>>>>
  • 你读过这个问题吗?我知道这一点,这正是我想要创建最终方法的原因。我想知道为什么 Netbeans 抱怨它。
  • 检查你的 netbeans 设置,它是这样配置的,给你警告。您可以禁用它。

标签: java netbeans


【解决方案1】:

这只是一个警告。

只是说你声明了final方法,但是以后要注意不要有人重写这个方法,否则你会得到一个错误,因为重写final方法/类是/不允许。

如果你有这样的设计,并且你认为这是一个好的设计,那么不要打扰这个警告;否则,请更改您的设计。

【讨论】:

    【解决方案2】:

    在 Netbeans 8+ 中:

    1. 转到Tools --&gt; Options
    2. 点击Editor顶部按钮
    3. 转到Hints 选项卡。
    4. 确保在Language 组合框中选择了Java
    5. 在左侧树视图中,展开Class Structure
    6. 检查Final method是否被选中。

    您的警告很可能发生,因为上述配置已启用,默认情况下不应启用。请注意当您启用 Final method 警告时 Netbeans 所说的内容:

    报告任何被声明为 final 的方法实例。一些编码标准不鼓励最终类。

    所以它真的不会试图变得聪明。它只是将它们全部报告为警告,因为有些人认为最终方法通常是不好的做法。

    编辑:评论跟进

    您最初的问题是:

    那么为什么 Netbeans 会抱怨呢?

    答案很简单:因为要求它抱怨任何时候它发现方法声明为final

    但我想知道它背后的逻辑是什么(如果有的话)。

    你暗示的方式没有逻辑。它不会尝试分析何时final 的特定使用是有意义的,以及何时不会警告您。它只是盲目地尊重您警告您所有在方法上使用 final 修饰符的请求。然后由您决定是否需要对警告采取行动。分析在特定情况下使用 final 修饰符是否合法的负担由您来承担。


    现在,在您的评论中,您现在说您的问题是:

    为什么这会困扰我?

    ...这不是同一个问题,并且没有在任何地方说明。但是既然你现在问,我会说这个问题没有明确的答案,而且很大程度上是基于意见的。这就是为什么在 Netbeans 中默认不启用警告的原因,因为有些人不会被 final 方法所困扰,并且认为它们有合法用途。

    有些人认为使用final 是邪恶的。例如,下面的article 说:

    邪恶案例:

    1. final 在用于标记类或方法时会阻碍或阻止重用。

    2. 将方法标记为final 不太可能提高JitCompiler 以来代码的运行时效率?已经有关于哪些方法被覆盖以及哪些是叶子的信息。

    3. 这是阅读代码的人必须扫描的另一个词。用大写命名常量很常见,所以final 是多余的。

    这些人通常认为默认情况下方法和类应该保持“解锁”状态,以防将来有人决定他们需要通过重写方法来重写类的一部分。

    相比之下,其他人(比如我)认为相反的情况更安全。我更喜欢默认情况下无法覆盖我的类/方法,并且我必须明确启用可以安全覆盖类的哪些部分(如果有)。这是 C# 等语言采用的默认设置,默认情况下,您不能覆盖方法。如果你想启用覆盖,你必须明确地做我标记基类的方法virtual

    哪个默认值更好(Java 或 C#)的问题是许多热门辩论的主题。有关示例,请参见 herehere

    那么,你站在辩论的哪一边:

    • 认为类/方法应该为继承/覆盖保持开放以防万一,或者
    • 认为应该默认锁定类/方法的一方,仅在必要时打开以进行继承/覆盖

    ... 将确定您是否会关心让 Netbeans 警告您有关 final 方法(以及final 类)。

    【讨论】:

    • 您是否阅读了问题末尾的注释?我通过说我知道我可以(并且我知道如何)禁用它来抢占这个答案。事实上,我故意启用它是因为我想被那些应该困扰我的事情所困扰。我的问题是“这为什么要困扰我?”
    • 我承认我错过了最后的注释:) 但公平地说,你的问题是So why is Netbeans complaining?,而不是why should this bother me?。无论如何,如果您仍然感兴趣,我扩展了我的答案以涵盖这两个问题。
    【解决方案3】:

    Netbeans 不会“抱怨它”。它只是在吸引你的注意力。

    类结构here所述的原因是,

    最终方法[默认禁用]

    报告任何被声明为 final 的方法实例。一些编码标准不鼓励最终类。

    自 NetBeans 6.9 起

    请查看this article 在 cmets 部分中由Mathias Begert 建议的内容。

    【讨论】:

    • 只是一个关于为什么的有趣补充:ibm.com/developerworks/java/library/j-jtp1029/j-jtp1029-pdf.pdf
    • @MathiasBegert 非常好的文章!谢谢!
    • 是的,有趣的文章。似乎final 被过度使用了,但我的情况需要一个绝对不应该被任何子类更改的方法,所以我认为它是合法的。那篇文章绝对是我一直在寻找的答案。
    猜你喜欢
    • 1970-01-01
    • 2013-06-19
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    相关资源
    最近更新 更多