Каковы преимущества анонимного внутреннего класса (по сравнению с неанонимным внутренним классом)? - PullRequest
7 голосов
/ 01 марта 2011

Рассмотрим это (анонимно):

speakBtn.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null);
    }});

против. это: (не анонимно):

class MyOuterClass {
    private class MyOnClickListener implements OnClickListener {
        @Override
        public void onClick(View view) {
            mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null);
        }
    }

    // later (inside some method)...
        speakBtn.setOnClickListener(new MyOnClickListener());
}

За исключением меньшего количества строк, есть ли еще какое-то преимущество для анонимной формы?

Есть ли преимущество в производительности?

Ответы [ 6 ]

4 голосов
/ 01 марта 2011

Анонимный внутренний класс имеет преимущество перед внутренним классом (как в коде примера вопроса) в том, что он закрывается над локальными переменными метода (хотя могут использоваться только final локальные).

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

(Это также локальные классы, которые являются именованными внутренними классами, определенными внутри метода, и которые закрываются поверх локальных.)

2 голосов
/ 01 марта 2011

Что мне нравится в именованных внутренних классах:

  • У них есть имя. Мне легче отлаживать, когда я вижу MyOuterClass$MyOnClickListener в трассировке стека вместо MyOuterClass$1, что вы получаете с анонимным внутренним классом.
  • Иногда помогает читабельность отделить фактический код для внутреннего класса от места, где вы его используете. Мне особенно нравится это, если я уже в длинном методе или с отступом больше, чем уровень или два.

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

2 голосов
/ 01 марта 2011

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

1 голос
/ 01 марта 2011

Есть один недостаток:

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

1 голос
/ 01 марта 2011

Преимущество - это время, которое вы экономите как разработчик, поскольку вам не нужно вводить дополнительные нажатия клавиш.:)

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

0 голосов
/ 11 августа 2016

Цель анонимных классов - сделать ваш обязательный класс локальным.Анонимные классы используются, когда мы очень уверены, что конкретный класс A является единственным потребителем для класса B, и нет, где еще этот класс B может быть использован. Тогда лучше мы определили этот класс B как анонимный класс внутри именованного класса A.пишут требуемую логику в том же классе, чтобы избежать создания объекта с внешней стороны.Это будет легко поддерживать с точки зрения удобства сопровождения кода.Таким образом, анонимные классы позволяют сделать ваш код более лаконичным.Они позволяют вам одновременно объявлять и создавать экземпляр класса.Они похожи на местные классы за исключением того, что у них нет имени.Используйте их, если вам нужно использовать локальный класс только один раз.

...