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

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

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

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

Ответы [ 14 ]

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

Я склонен использовать анонимные внутренние классы в ситуациях, когда мне не нужно иметь полноценный класс просто для выполнения какой-либо задачи. Например, если я хочу реализовать ActionListener или Runnable, но я не думаю, что наличие внутреннего класса было бы необходимым. Например, для запуска простого Thread использование анонимного внутреннего класса может быть более читабельным:

public void someMethod()
{
    new Thread(new Runnable() {
        public void run()
        {
            // do stuff
        }
    }).start();
}

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

public void someMethod()
{
    new Thread(new MyRunnable()).start();
}

// ... several methods down ... //

class MyRunnable implements Runnable
{
    public void run()
    {
        // do stuff
    }
}

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

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

12 голосов
/ 07 июня 2012

Еще одно хорошее использование анонимного внутреннего класса - это когда вам нужно инициализировать коллекции, такие как ArrayList и Set. Эта практика также известна как инициализация двойной скобки Например,

private static final Set<String> VALID_CODES = new HashSet<String>() {{
add("XZ13s");
add("AB21/X");
add("YYLEX");
add("AR2D");
}};

Очевидно, это не ограничивается коллекциями; его можно использовать для инициализации любого объекта - например, объектов Gui:

 add(new JPanel() {{
setLayout(...);
setBorder(...);
add(new JLabel(...));
add(new JSpinner(...));
}});
11 голосов
/ 28 января 2009

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

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

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

4 голосов
/ 03 января 2011

Улучшение или ухудшение разборчивости в классе - вопрос вкуса. Главная проблема определенно не здесь.

Анонимные классы, как и внутренние классы, содержат ссылку на включающий класс, создавая, таким образом, не приватные вещи, которые без него были бы. Короче говоря, ссылка this включающего класса может выходить через внутренний класс. Таким образом, ответ таков: очень плохая практика - использовать внутренний класс, если он публикует сам себя, поскольку это автоматически публикует включающий класс. например:

changeManager.register(new ChangeListener() {
    public void onChange(...) {
       ...
    }});

Здесь анонимный ChangeLstener передается в регистр метод ChangeManager . Это также автоматически опубликует включающий класс.

Это определенно плохая практика.

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

Я использую анонимные классы в основном для интерфейсов, которые имеют только один метод, то есть Runnable или ActionListener . Большинство больших интерфейсов требуют своих собственных классов или реализации в уже существующем классе. И, по моему мнению, мне не нужны аргументы в его поддержку.

2 голосов
/ 30 ноября 2012

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

class AnonymousClass{

public static void main(String args[]){


    Runnable run1=new Runnable(){

        public void run(){

            System.out.println("from run1");
        }

    };
    Runnable run2=new Runnable(){

        public void run(){

            System.out.println("from run2");
        }

    };
    Runnable run3=new Runnable(){

        public void run(){

            System.out.println("from run3");
        }

    };



    Thread t1=new Thread(run1);
    Thread t2=new Thread(run2);
    Thread t3=new Thread(run3);


    t1.run();t2.run();t3.run();

}
}

выход:

от пробега 1

от пробега2

от пробега3 * ​​1011 *

В приведенном выше фрагменте кода я использовал три потока для выполнения трех различных задач. Смотри, я создал три анонимных класса, которые содержат реализацию метода run для выполнения трех разных небольших задач.

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

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

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

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

Зависит от того, с чем вы их сравниваете. Я предпочел бы иметь их, чем не иметь их, но тогда я бы предпочел предоставлять блоки простого кода для методов, таких как Arrays.sort (), чем необходимость явно создавать класс, содержащий мою реализацию compare ().

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

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

...