为什么java.util.Scanner类声明为'final'?

Roa*_*alt 5 java oop final java-api

我使用Scanner类来读取多个类似的文件.我想扩展它以确保它们都使用相同的分隔符,我还可以添加所有对它们都有效的skipUntilYouFind(String thisHere)等方法.

我可以创建一个包含它们的实用程序类,或者将Scanner类作为变量嵌入到另一个类中,但这更麻烦.

我找到了一些宣布课堂决赛的理由,但为什么要在这里完成呢?

And*_*anu 5

可能是因为扩展它并覆盖它的一些方法可能会破坏它。并且使覆盖方法更容易将暴露许多内部工作,因此如果将来他们决定更改这些(出于性能或其他原因),他们将更难在不破坏所有类的情况下更改类扩展它。

例如,考虑类中的以下方法:

public boolean nextBoolean()  {
    clearCaches();
    return Boolean.parseBoolean(next(boolPattern()));
}
Run Code Online (Sandbox Code Playgroud)

假设你想覆盖它,因为你想让 'awesome' 评估为 'true' 布尔值(无论出于何种原因)。如果覆盖它,则不能调用 super.nextBoolean(),因为这将使用默认逻辑消耗下一个标记。但是,如果您不调用 super.nextBoolean(),则不会调用 clearCaches(),这可能会破坏其他未覆盖的方法。你不能调用 clearCaches() 因为它是私有的。如果他们让它受到保护,但随后意识到它会导致性能问题,并且想要一个不再清除缓存的新实现,那么他们可能会破坏您的覆盖实现,该实现仍然会调用它。

所以基本上是这样他们可以轻松地更改类中隐藏的部分,这些部分非常复杂,并保护您免于创建损坏的子类(或容易损坏的类)。

  • 按照这个逻辑,一切都应该是最终类。老实说我不敢相信这就是原因。 (2认同)