2010-08-21 3 views
6

В Java существует ли способ предотвратить расширение интерфейса.Как предотвратить расширение интерфейса

С final не может быть добавлено в interface, мне было любопытно узнать, существует ли способ, если таковой имеется, для предотвращения расширения интерфейса.

+4

Какова мотивация для этого? На мой взгляд, нет ничего, что можно получить семантически, если вы поймете, какие интерфейсы и для чего они используются. – Santa

+0

, если вы не создаете интерфейс, он не может быть расширен, если some1 еще не создает его, поэтому скажите no1. – IAdapter

ответ

2

Невозможно предотвратить расширение интерфейса.

Вы можете обнаружить, что кто-то расширил ваш интерфейс во время выполнения, используя отражение.

+0

Можете ли вы рассказать о том, как мы можем найти, был ли интерфейс расширен через отражение? – JWhiz

+0

@JWhiz: Ваш второй вопрос очень похож на этот: http://stackoverflow.com/questions/435890/find-java-classes-implementing-an-interface Единственное различие заключается в том, что вас интересуют интерфейсы, а не классы , но техника такая же. –

3

Проблема здесь концептуальна. Интерфейсы предназначены для расширения, поскольку они не могут использоваться как есть.

Что вы можете сделать, это поместить интерфейс внутри пакета и дать ему видимость по умолчанию. При этом только классы внутри этого пакета могут реализовать этот интерфейс.

Но с этим решением вы также теряете возможность использовать интерфейс вне этого пакета, поэтому это не настоящее решение.

+0

Я думаю, что он означает, что другой интерфейс расширяется от данного интерфейса. –

+3

Правильно, но концепция по-прежнему остается ключом: интерфейс - это просто способ сказать, что определенные методы работают определенным образом. Расширение интерфейса тогда просто говорит о том, что в системе есть какой-то другой интерфейс. Не имеет смысла запрещать определение интерфейса так же, как «окончательное» ключевое слово работает с классами, где фактический код может в конечном итоге использоваться способами, противоречащими исходному проекту, если этот класс расширен. –

0

Это очень похоже на ранее заданный вопрос - final interface in java.

Я дал два ответа.

  1. Да, через byte code engineering. Полученный интерфейс не может быть расширен, но не имеет практического значения.
  2. Да, annotations - это интерфейсы, которые не могут быть расширены другими интерфейсами.

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

Смежные вопросы