Можно ли передать параметры или получить доступ к внешним параметрам анонимному классу? Например:
int myVariable = 1;
myButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// How would one access myVariable here?
}
});
Есть ли способ для слушателя получить доступ к myVariable или быть переданным myVariable без создания слушателя как фактического именованного класса?
java
anonymous-class
Льюис
источник
источник
final
локальные переменные из включающего метода.this
.Ответы:
Технически нет, потому что анонимные классы не могут иметь конструкторов.
Однако классы могут ссылаться на переменные из областей действия. Для анонимного класса это могут быть переменные экземпляра из содержащего класса (классов) или локальные переменные, помеченные как окончательные.
редактирование : как указал Питер, вы также можете передавать параметры в конструктор суперкласса анонимного класса.
источник
new ArrayList(10) { }
super()
и до остальной части фактического конструктора.new someclass(){ fields; {initializer} fields; methods(){} }
, Это похоже на статический инициализатор, но без ключевого слова static. docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6Да, добавив метод инициализатора, который возвращает 'this', и немедленно вызвав этот метод:
Не требуется «окончательная» декларация.
источник
final
ссылочного объекта, чтобы я мог получать информацию в свои анонимные классы. Спасибо, что поделились!init()
функция должна возвращатьсяthis
? Я не понимаю синтаксис на самом деле.да. Вы можете захватить переменную, видимую для внутреннего класса. единственное ограничение в том, что оно должно быть окончательным
источник
this
который является окончательным.final
? Я не могу найти альтернативу. Это может повлиять на параметр источника, который предназначен дляfinal
.Как это:
источник
Это сделает волшебство
источник
Как показано на http://www.coderanch.com/t/567294/java/java/declare-constructor-anonymous-class, вы можете добавить инициализатор экземпляра. Это блок, который не имеет имени и исполняется первым (как конструктор).
Похоже, они также обсуждались в разделе Почему инициализаторы java-экземпляров? и Чем инициализатор экземпляра отличается от конструктора? обсуждаются отличия от конструкторов.
источник
final
переменными, как описано aav, но эта информация не была предоставлена в этом ответе. Безусловно, лучший ответ - тот, который дал Адам Млодзинкси (я теперь использую этот образец исключительно, больше никаких финалов!). Я поддерживаю мой комментарий, что это не отвечает на заданный вопрос.Мое решение состоит в том, чтобы использовать метод, который возвращает реализованный анонимный класс. Обычные аргументы могут быть переданы методу и доступны в анонимном классе.
Например: (из некоторого кода GWT для обработки изменения текстового поля):
В этом примере на новый анонимный метод класса будет ссылаться:
ИЛИ , используя требования ОП:
источник
Другие люди уже ответили, что анонимные классы могут получить доступ только к конечным переменным. Но они оставляют открытым вопрос, как сохранить исходную переменную не финальной. Адам Млодзинский дал решение, но это довольно раздутый. Существует гораздо более простое решение проблемы:
Если вы не хотите
myVariable
быть окончательным, вы должны обернуть его в новую область, где это не имеет значения, если оно окончательно.Адам Млодзинский не делает ничего другого в своем ответе, но с гораздо большим количеством кода.
источник
init
метода. Я могу добавить еще одну строку кода в мой пример, чтобы иметь эту дополнительную переменную. Если вы большой поклонник шаблонов построения, не стесняйтесь использовать их, но в этом случае они не нужны.final
решения переменной.Вы можете использовать простые лямбда-выражения («лямбда-выражения могут захватывать переменные»)
или даже функция
Использование функции является отличным способом реорганизации декораторов и адаптеров, см. Здесь
Я только начал узнавать о лямбдах, поэтому, если вы заметите ошибку, не стесняйтесь написать комментарий.
источник
Простой способ поместить какое-либо значение во внешнюю переменную (не принадлежит классу anonymus) - вот как!
Таким же образом, если вы хотите получить значение внешней переменной, вы можете создать метод, который возвращает то, что вы хотите!
источник
Я думал, что анонимные классы были в основном похожи на лямбды, но с худшим синтаксисом ... это оказывается правдой, но синтаксис еще хуже и заставляет (что должно быть) локальные переменные вытекать в содержащий класс.
Вы не можете получить доступ к окончательным переменным, превратив их в поля родительского класса.
Например
Интерфейс:
класс:
Я не знаю, разобрались ли они в java 8 (я застрял в мире EE и еще не получил 8), но в C # это будет выглядеть так:
Вам не нужен отдельный интерфейс в C # либо ... Я скучаю по нему! Я делаю худшие проекты в java и повторяюсь больше, потому что объем кода + сложность, которую вы должны добавить в java для повторного использования чего-либо, хуже, чем просто копировать и вставлять большую часть времени.
источник