Каков вариант использования защищенного метода в финальном классе в Java?

Рассмотрим этот код из официального Исходный код OpenJDK для java.awt.font.TextLayout:

public final class TextLayout {

    /* ... */

    protected void handleJustify(float justificationWidth) {
      // never called
    }
}

Каков здесь вариант использования и почему вообще может иметь смысл писать такой код?


person soc    schedule 28.07.2011    source источник
comment
Этот конкретный метод кажется совершенно бесполезным.   -  person Joachim Sauer    schedule 28.07.2011


Ответы (5)


Доступ к protected членам по-прежнему возможен с помощью кода из того же пакета. Я предполагаю, что класс был не окончательным в какой-то более ранней (возможно, даже не общедоступной) версии, затем был сделан окончательным, а защищенный метод остался как таковой, потому что в том же пакете может быть код, который его использует (а не изменен на пакетный частный просто потому, что никто не видел в этом выгоды).

person Michael Borgwardt    schedule 28.07.2011
comment
@Michael, предполагает ли наличие защищенного метода, что TextLayout ранее действительно предназначался для подкласса? - person Pacerier; 22.08.2014
comment
@Pacerier: да, это единственная причина использовать protected. - person Michael Borgwardt; 22.08.2014

Защищено (см. уровни доступа):

  • Для расширения классов, независимо от пакета.
  • Все классы в текущем пакете могут получить к нему доступ.

В случае класса final этот метод используется другими классами в том же пакете: это то же самое, что и без модификатора доступа (также называемого "приватным пакетом").

person Pindatjuh    schedule 28.07.2011
comment
тогда почему бы не использовать package-private? - person Bozho; 28.07.2011
comment
@Божо: предположительно по историческим причинам - person Michael Borgwardt; 28.07.2011
comment
Но в случае использования 2 можно было бы определить метод без квалификатора видимости. Так что, возможно, это правда, что нет особого смысла иметь защищенный метод в финальном классе. - person Giorgio; 28.07.2011
comment
@Божо, может быть, обратная совместимость? - person Carlos Quintanilla; 28.07.2011
comment
Возможно модификатор класса final был добавлен позже. - person Pindatjuh; 28.07.2011
comment
С каких это пор package-private обычно не используется?? - person orbfish; 06.11.2011
comment
@Pindatjuh, почему ты говоришь, что package-private мало используется? - person Pacerier; 22.08.2014
comment
Теперь понял, что package-private (или package-local) на самом деле используется довольно часто. - person Pindatjuh; 31.10.2014

Использовать только в собственной упаковке

protected - member - Доступен только внутри своего пакета и его подклассов

если кто-то определяет метод как final, то он не может быть переопределен и динамически просматривается.

Ссылка здесь: http://www.javacamp.org/javaI/Modifier.html

person Carlos Quintanilla    schedule 28.07.2011

Класс не может быть расширен или подклассирован, но метод по-прежнему доступен из пакета.

person JK.    schedule 28.07.2011

Просто так: если бы этот класс расширял другой, защищенный метод мог бы расширять защищенный метод в суперклассе. Еще одну возможную причину искать.

person orbfish    schedule 05.11.2011