Анонимные внутренние классы: объявлены как переменные экземпляра, а не создаются на лету

Я занимаюсь рефакторингом класса с общедоступным интерфейсом, и размышления об использовании заставили меня спросить:

В чем разница между объявлением следующего в более крупном классе (в качестве переменной экземпляра):

private final OnClickListener mButtonOnClickListener = new OnClickListener() {
    @Override
    public void onClick(View view) {            
        //some codes
    }
};

vs объявить как анонимный внутренний класс следующим образом (на лету):

private void someFunctionInClass() {
    someOtherFunctionThatTakesAnOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {            
            //some codes
        }
    });
}

В частности, первый по-прежнему считается анонимным внутренним классом? Я прочитал в этом ответе, что анонимный внутренний класс

- это тот, который создается И определяется в теле метода другого класса

Первый пример, который я привел, создается и определяется в теле другого класса, но не в методе другого класса, как второй. Это все еще анонимный внутренний класс? Кроме того, какова общепринятая практика по отношению друг к другу? Является ли более эффективным объявить (как я думаю, все еще) анонимный внутренний класс в качестве переменной экземпляра, потому что новые объекты не нужно воссоздавать?


person Daniel Smith    schedule 21.03.2013    source источник
comment
Анонимный класс - это анонимный класс. В обоих случаях по-прежнему создается только один [анонимный] тип - использование результирующих экземпляров не имеет отношения к самому типу.   -  person    schedule 22.03.2013


Ответы (5)


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

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

person Andrew Mao    schedule 21.03.2013

Оба эти класса анонимны. Кроме прицела особой разницы нет. Но ниже приведена ссылка, по которой можно выбрать, какой из локальных классов использовать: Анонимный класс: Вложенный класс: Лямбда-выражение: http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html

Я надеюсь, что это помогает.

person Jabir    schedule 21.03.2013

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

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

person Sudhanshu Umalkar    schedule 21.03.2013

Оба являются анонимными классами. Анонимный класс - это конструктор (new ClassName()), за которым следует тело класса ({...}).

person Javier    schedule 21.03.2013

В ваших примерах в обоих случаях вы создали анонимный внутренний класс. Что это "новый OnClickListener () {", я думаю, что у него нет накладных расходов с момента его разрешения во время компиляции. Люди пользуются им постоянно.

person user1697575    schedule 21.03.2013