Анонимные классы - плохая идея?

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

Вы получаете final повсюду, и независимо от того, какой код читать труднее, чем если бы вы использовали хорошо названный внутренний класс.

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
0
1 195
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Обычно я ограничиваю анонимные классы несколькими строками. Все, что длиннее, например, 5, создает именованный класс.

Или хотя бы статический вложенный класс

matt b 06.11.2008 19:49
Ответ принят как подходящий

Преимущество в том, что это реализация замыканий. Это неуклюже, но это лучшее, что у нас есть на Java на данный момент. Другими словами, вам не нужно создавать новый класс только для сохранения некоторого состояния, которое у вас уже есть как локальная переменная.

У меня есть статья, сравнивающая закрытие C# и Java, и почему они вообще полезны, что может помочь.

У меня создалось впечатление, что анонимные внутренние классы Java НЕ закрываются в своей среде, но у меня нет ссылки или примера, чтобы поддержать меня.

hark 06.11.2008 19:30

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

Eli Courtwright 06.11.2008 19:48

Я тоже не уверен в этом. Если я понимаю замыкания, вы можете передать ссылку на замыкание, и оно сохранит ссылки на связанные переменные охватывающей области, в которой оно было создано. Я думаю, что этого не хватает в анонимных классах Java.

Bill the Lizard 06.11.2008 19:51

Это в основном поддельные затворы. Он копирует значения в новый класс. Учитывая, что у вас в любом случае есть доступ только для чтения, а переменные окончательные, это достаточно близко к закрытию. Это копия среды, а не сама среда, но очень часто это достаточно близко.

Jon Skeet 06.11.2008 20:02

Это все еще лучшая практика, сэр?

dgngulcan 01.03.2016 18:19

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

this.addListener(new IListener(){
    public void listen() {...}
});

Я рекомендую вам эта статья, который я нашел очень поучительным.

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

Аномальные классы могут быть полезны. Но то, что я часто видел, было бесполезным. Многие анонимные классы были слишком большими и снижали удобочитаемость. Некоторые эксперты используют множество идентичных анонимных классов. Нет строгого правила, когда использовать анонимный класс или нет, но есть правила большого пальца:

  1. Большие и сложные классы не должны быть анонимными.

  2. Должна быть гарантирована читаемость класса контейнера.

  3. СУХОЙ - не повторяйся. Не создавайте два одинаковых анонимных класса.

  4. Если у вас много неидентичных, но похожих анонимных классов, вам следует определить части этих классов, которые вы можете использовать повторно. Попробуйте использовать шаблонный метод pattern.

Для качества кода и программного обеспечения важно уменьшить избыточность. «Копирование и вставка» - это антипаттерн в программировании, потому что исходный фрагмент кода может содержать ошибку. Если кто-то копирует этот фрагмент кода, он дублирует ошибку. Десять недель спустя кто-то другой обнаруживает ошибку и исправляет ее, но другая ошибка все еще присутствует в коде, и на ее поиск и исправление уходит еще десять недель. W

Другие вопросы по теме