Метод Java, который может быть вызван только его собственным классом или другими подклассами.

Я бы хотел, чтобы в моем классе был метод, который можно вызывать только сам по себе или его подклассы.

Ближе всего это protected доступ, но он также позволяет другим классам в том же пакете вызывать метод, чего я не хочу.

Есть ли способ добиться этого, или мне следует вместо этого рассмотреть какой-то рефакторинг пакета?

Мне кажется, что private не позволит подклассам использовать этот метод.


person Voldemort    schedule 11.01.2014    source источник
comment
Переключитесь на Scala, который переопределяет ключевое слово protected, чтобы оно означало то, что вы хотите ;-)   -  person Robin Green    schedule 11.01.2014
comment
Кто-нибудь еще помнит private protected, когда Java была молодой? stackoverflow.com/a/903050/831878   -  person Ray Toal    schedule 11.01.2014


Ответы (4)


См. раздел В Java разница между стандартным, общедоступным, защищенным и частным

Такого нет. Но вы можете переместить класс в пустой пакет и использовать protected.

person Markus Malkusch    schedule 11.01.2014

Краткий ответ: рефакторинг ваших пакетов

Объяснение:

Спецификация Java считает отношение package более близким отношением, чем отношение subclass. Это потому, что я могу расширить любой класс, пока я его импортирую.

Если вы хотите быть уверены, что метод недоступен даже для подклассов вне пакета, используйте модификатор видимости default.

Источник

Справочник по переполнению стека

person Scott    schedule 11.01.2014

Для этого поместите свой класс в отдельный пакет и сделайте защиту методов по умолчанию. В пакете не будет никаких других классов, чтобы увидеть его, чтобы вызвать его через доступ к пакету.

Учтите также, что если вы запечатаете банку, класс в том, что только вы контролируете то, что находится в данном пакете, и эффективно блокируете любых других от создания класса в пакете, который вы определяете - никто другой не сможет ввести класс в пакет и нарушить инкапсуляцию.

person Community    schedule 11.01.2014
comment
Однако запечатывание jar-файла не может помешать кому-либо извлечь содержимое файла, добавить свой собственный класс в пакет, а затем использовать комбинацию в своем собственном коде, независимо от того, используется ли комбинация как отдельные файлы или после объединения файлов в новый пакет. jar файл ... возможно, запечатанный ... На самом деле это не проблема, конечно, если кто-то не верит, что пакеты, ключевые слова доступа или запечатанные банки дают какую-то гарантию, что это не так. - person Ned; 11.01.2014
comment
Этот метод делает невозможным создание подкласса класса, что нарушает условия вопроса. -1 - person user207421; 11.01.2014
comment
@ejp вы путаете запечатывание банки с окончательным классом? - person ; 11.01.2014
comment
@MichaelT Вопрос смешной. - person user207421; 11.01.2014

Извините, но protected — ваш единственный выбор, если вы хотите, чтобы подклассы могли вызывать или переопределять метод, не делая его public. Если вы по какой-то причине не хотите, чтобы другие классы в том же пакете имели доступ, переместите свой класс в новый пакет. Но если вы думаете, что ключевые слова управления пакетом и доступом образуют своего рода систему DRM (то есть управления цифровыми правами), а не просто систему управления кодом и классом «контракт», вы ошибаетесь. Думайте о ключевых словах управления доступом как о не более чем документации, которую компилятор может проверить, когда другой код не соответствует заявленному намерению, выраженному в документации.

person Ned    schedule 11.01.2014