【问题标题】:Java. local classes is there any reason not to make it final?爪哇。本地课程有什么理由不让它成为最终的吗?
【发布时间】:2011-11-15 13:40:14
【问题描述】:

我有一个关于 Java 中的本地类(在方法中或在由 { } 界定的块中声明的类)的问题。

有什么理由不将本地类声明为final?我们不能从本地类继承其他类(如果它没有在同一范围内定义),但是当我们将其声明为final时,也许编译器可以使代码更简单?

谢谢!

【问题讨论】:

  • “在方法中声明的类或在 {}) 边界的块中声明的类是什么意思?您是在谈论内部类还是只是新的实例声明?请举例说明您的意思。 (欢迎来到 StackO!)
  • 如果“我们不能从本地类继承其他类”将其声明为 final 的原因/优势是什么?
  • @Guillaume 他说的是本地课程。就嵌套类而言,您有静态嵌套类、非静态嵌套类(称为“内部类”)、本地类和匿名类。本地类在方法体或代码块中定义,并且只能在该范围内使用。
  • 好的,现在知道了 - 我以前从未使用过本地类 :)

标签: java local-class


【解决方案1】:

人们似乎对匿名类和本地类有点困惑。这是一个本地类:

public void m() {
   class MyClass{}
   MyClass cl = new MyClass();
}

可以声明MyClass final,但实际上可以从它继承,因此Java中的其他任何地方都可以将其声明为final以避免这种情况:

public void m() {
   class MyClass{}
   MyClass cl = new MyClass();
   class MyOtherClass extends MyClass{}
   MyOtherClass cl2 = new MyOtherClass();
}

据我所知,匿名类不被认为是最终的。但是,从语法上讲,没有办法从它们继承,因此需要一个强大的类文件 hack 才能这样做。

【讨论】:

  • 是的,但是这样的类的每个实现都可以在没有继承的情况下毫无问题地进行。我的意思是,如果您的方法包含较大的层次结构,那可能是设计问题?如果层次结构不大,则不需要继承。
【解决方案2】:

在任何情况下都没有理由不声明 final,除非您明确地打算继承。

我猜不这样做的原因主要是疏忽,因为在大多数情况下没有明显的实际后果。某些代码分析工具(如 FindBugs)会警告您是否可以将字段声明为 final。

关于final关键字的普遍使用的问题有很好的答案可以在here找到

【讨论】:

    【解决方案3】:

    没有理由不这样做,除非它是您的代码中不需要的关键字。 IE。没有理由不这样做,也没有理由这样做。如果类在方法中声明,则不能从任何其他地方访问它,因此不能被子类化。那么,为什么要阻止无法做到的事情呢?

    因此,添加这个词不会以任何方式改变行为,但会使您的代码变得混乱。有人可能会想“为什么这门课是决赛,我是不是漏掉了什么花哨的东西?”

    【讨论】:

    • 本地类可以被子类化。请参阅 Mathias Schwarz 的回答。
    • 是的,但只能在同一个区块中。
    • 嗯,是的,因为你不能在定义它们的块之外对它们做任何事情。
    【解决方案4】:

    “在方法中声明的类”是匿名类,“在由 { } 包围的块中声明的类”是内部类

    匿名类不能声明为final,因为没有办法继承它。

    内部类可以是final,除非它有任何子类。

    【讨论】:

    • 没有。您可以在方法中声明一个非匿名类。它被称为本地类。很少使用,但它存在。并且术语“内部类”只能用于非静态嵌套类。
    • -1 请参阅 Mathias Schwarz 的回复以获取本地内部类的示例,并在此处:docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    相关资源
    最近更新 更多