После некоторого использования их я не могу не чувствовать, что обручи, через которые вы вынуждены прыгать при использовании анонимных классов, не стоят того.
Вы получаете final повсюду, и независимо от того, какой код читать труднее, чем если бы вы использовали хорошо названный внутренний класс.
Так в чем же преимущества их использования? Я, должно быть, что-то упускаю.




Обычно я ограничиваю анонимные классы несколькими строками. Все, что длиннее, например, 5, создает именованный класс.
Преимущество в том, что это реализация замыканий. Это неуклюже, но это лучшее, что у нас есть на Java на данный момент. Другими словами, вам не нужно создавать новый класс только для сохранения некоторого состояния, которое у вас уже есть как локальная переменная.
У меня есть статья, сравнивающая закрытие C# и Java, и почему они вообще полезны, что может помочь.
У меня создалось впечатление, что анонимные внутренние классы Java НЕ закрываются в своей среде, но у меня нет ссылки или примера, чтобы поддержать меня.
Они есть, но единственные переменные, к которым вы можете получить доступ из внешней области видимости, - это те, которые объявлены final.
Я тоже не уверен в этом. Если я понимаю замыкания, вы можете передать ссылку на замыкание, и оно сохранит ссылки на связанные переменные охватывающей области, в которой оно было создано. Я думаю, что этого не хватает в анонимных классах Java.
Это в основном поддельные затворы. Он копирует значения в новый класс. Учитывая, что у вас в любом случае есть доступ только для чтения, а переменные окончательные, это достаточно близко к закрытию. Это копия среды, а не сама среда, но очень часто это достаточно близко.
Это все еще лучшая практика, сэр?
Ну, я обычно использую его только тогда, когда мне нужна реализация интерфейса для одной цели (и интерфейс с несколькими функциями или кодом, потому что он действительно быстрый уродливый) ... как в следующем примере:
this.addListener(new IListener(){
public void listen() {...}
});
Я рекомендую вам эта статья, который я нашел очень поучительным.
Вы говорите, что ключевое слово окончательный повсюду, но с локальным классом вам все равно нужно передать состояние включающего класса, что также может быть плохо для читабельности.
Аномальные классы могут быть полезны. Но то, что я часто видел, было бесполезным. Многие анонимные классы были слишком большими и снижали удобочитаемость. Некоторые эксперты используют множество идентичных анонимных классов. Нет строгого правила, когда использовать анонимный класс или нет, но есть правила большого пальца:
Большие и сложные классы не должны быть анонимными.
Должна быть гарантирована читаемость класса контейнера.
СУХОЙ - не повторяйся. Не создавайте два одинаковых анонимных класса.
Если у вас много неидентичных, но похожих анонимных классов, вам следует определить части этих классов, которые вы можете использовать повторно. Попробуйте использовать шаблонный метод pattern.
Для качества кода и программного обеспечения важно уменьшить избыточность. «Копирование и вставка» - это антипаттерн в программировании, потому что исходный фрагмент кода может содержать ошибку. Если кто-то копирует этот фрагмент кода, он дублирует ошибку. Десять недель спустя кто-то другой обнаруживает ошибку и исправляет ее, но другая ошибка все еще присутствует в коде, и на ее поиск и исправление уходит еще десять недель. W
Или хотя бы статический вложенный класс