Использование анонимных классов в Java считается плохим стилем или хорошим? - PullRequest
36 голосов
/ 28 января 2009

Я знаю, что анонимные классы сохраняют типизацию, когда дело доходит до реализации Listener и подобных вещей. Они пытаются заменить некоторые варианты использования крышек.

Но что сообщество думает о ценности этой языковой функции? Имеет ли это смысл и регулярно ли вы им пользуетесь? Делает ли это код более понятным, более понятным и более понятным? Или анонимные классы делают код менее читабельным?

Каково ваше мнение, и, пожалуйста, приведите примеры / аргументы, чтобы поддержать ваше мнение?

Ответы [ 14 ]

0 голосов
/ 01 мая 2017

Анонимные классы не скрывают код, но делают ТЕНД, чтобы сделать его немного менее пригодным для повторного использования. Обратите внимание, что это относится и к замыканиям.

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

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

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

Я видел довольно много GUI, в которых кто-то начинал с анонимных внутренних классов в качестве ответчиков на события. Многим приходилось делать что-то немного другое, например, 5 строк кода, где единственная разница - строка посередине. Если вы привыкли использовать внутренние классы, то простым решением будет скопировать и вставить блок и заменить эту строку.

Решение создания нового «Именованного» класса с строковым параметром и передачи этого класса всем методам редко приходит кому-то в этот момент. Этот именованный класс может использовать параметры или наследование для определения различных поведений, а также кода.

Я фанат замыканий и не ненавижу анонимные занятия - просто указываю на некоторые подводные камни, которые я видел.

0 голосов
/ 28 января 2009

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

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

0 голосов
/ 28 января 2009

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

b) ситуация, когда я не смогу оправдать создание нового класса, например, в Swing, когда вам нужно присоединить actionlistner, позволяющий JButton выполнять некоторые тривиальные операции.

0 голосов
/ 28 января 2009

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

...