Java: внутренний класс интерфейса (из Google Guice) - PullRequest
1 голос
/ 31 декабря 2010


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

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

Теперь я вижу следующие строки на

public static final Scope SINGLETON = new Scope() {
    public <T> Provider<T> scope(final Key<T> key, final Provider<T> creator) {
      return new Provider<T>() {
.........
}

Он присваивает экземпляр внутреннего класса статической переменной, но Scope - это интерфейс, определенный как ( at )

открытый интерфейс Scope

Часть 1:

Можно ли создать экземпляр интерфейса ?? или это краткий синтаксис для анонимной реализации интерфейса ??

Часть 2:

Если кто-то может объяснить, что автор подразумевает под несколькими вложенными классами выше (Scope и Provider), и почему имеет смысл реализовать этот способ, это поможет мне понять. спасибо.

Ответы [ 2 ]

2 голосов
/ 31 декабря 2010

Можно ли создать экземпляр интерфейса?или это краткий синтаксис для анонимной реализации интерфейса?

Yup и yup.

Это кажется для создания объекта из интерфейса;как это работает?

Что означает синтаксис в Java: новый поток () {...}?

Пример 3.11интерфейс перечисления в http://docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm

public java.util.Enumeration enumerate() {
  // The anonymous class is defined as part of the return statement
  return new java.util.Enumeration() { 
      ....
  };  // Note the required semicolon: it terminates the return statement
}

Если кто-то может объяснить, что автор предназначен для нескольких вложенных классов выше

Ничего особенного во вложении - оба анонимныклассы и используют анонимный класс по той же причине, по которой вы используете анонимные классы где-либо еще: когда у вас есть одноразовая реализация для интерфейса или подкласса, т.е. у вас нет причин отделять определение / реализацию от использования.

2 голосов
/ 31 декабря 2010

Блок {} после создает анонимный внутренний класс, который реализует данный интерфейс.

Часто встречается и с Runnable.

...