在Java的最终类中受保护方法的用例是什么?

soc*_*soc 7 java inheritance final awt

考虑从官方的这段代码OpenJDK源码java.awt.font.TextLayout:

public final class TextLayout {

    /* ... */

    protected void handleJustify(float justificationWidth) {
      // never called
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的用例是什么?为什么编写这样的代码一般有意义?

Pin*_*juh 5

受保护的是(参见访问级别):

  • 用于扩展类,不管包.
  • 当前包中的所有类都可以访问它.

对于final类,该方法由同一个包中的其他类使用:它与无访问修饰符(也称为"package-private")相同.

  • 那么为什么不使用package-private? (3认同)

Mic*_*rdt 5

protected仍然可以通过同一包中的代码访问成员。我的猜测是,该类在某些早期版本(可能甚至不是公共版本)中曾经是非最终的,然后被设置为最终的,并且受保护的方法保持原样,因为在使用它的同一包中可能有代码(而不是之所以将其更改为私有包,仅仅是因为没有人看到这样做的好处。