Java: абстрактный класс содержит статическое поле собственного класса, странно инициализированного - PullRequest
0 голосов
/ 22 февраля 2011

В плагине Eclipse CDT я нашел этот необычный способ инициализации поля абстрактного класса.

Поле ALL ссылается на класс самого класса.

abstract public class IndexFilter {
    public static final IndexFilter ALL = new IndexFilter() {};
    ....
}

Какова роль нового IndexFilter () {};

Можете ли вы объяснить эту инициализацию?

Ответы [ 4 ]

2 голосов
/ 22 февраля 2011

IndexFilter() {}; создает «анонимный подкласс» из IndexFilter.Поскольку фигурные скобки пусты, подкласс ничего не переопределяет в базовом классе.Поскольку IndexFilter является абстрактным, его нельзя создать напрямую, поэтому необходим подкласс.

1 голос
/ 22 февраля 2011

Я думаю, что вы называете «необычным» тот факт, что это анонимный внутренний (или, точнее, вложенный) класс.

new IndexFilter() {} создает конкретный подкласс IndexFilter и экземпляр этого подкласса в одном выражении. Очевидно, это возможно только потому, что IndexFilter не имеет абстрактных методов. Если бы это было так, вам нужно было бы обеспечить реализацию для них между фигурными скобками.

0 голосов
/ 22 февраля 2011

Похоже, что это просто отдельный легкодоступный экземпляр IndexFilter, который ничего не отменяет.

0 голосов
/ 22 февраля 2011

Это означает, что фильтр будет передавать всю информацию.Обычно фильтр предназначен для фильтрации некоторых записей.ВСЕ это особый случай здесь.Вы также можете рассматривать NONE как особый случай, который отфильтрует всю информацию.

Пример:

a.select(b, IndexFilter.ALL);
a.select(b, new IndexFilter() {
   ...
});

Другим классом, использующим такой шаблон, является Integer с MAX_VALUE и MIN_VALUE.

...