Friday September 05 2003 14:12, Anton Moscal wrote to Sergei Kozello:
SK>> public void proc() {
SK>> final int local = 11;
SK>> new Inner() {
SK>> public void write() {
SK>> System.out.println( "global=" + global );
SK>> System.out.println( "local=" + local );
SK>> }
SK>> }.write();
AM> Мне как-то непонятен смысл этого примера - он ничем не отличается от
AM> просто
AM> System.out.println( "global=" + global );
AM> System.out.println( "local=" + local );
AM> Если же речь идет о параметризации некоторого действия виртуальным
AM> методом - то делается "в лоб":
AM> do_something (fun () ->
AM> printf "global=%d" global;
AM> printf "local=%d" local
AM> )
Я здесь видимо привел слишком упрощенный пример. Я имел в виду что-то типа
применения шаблона Template как сделано в классе Thread: переопределяем метод
run() и вызываем метод start();
А замена действительно осуществляетс просто как ты сказал: вместо внутреннего
класса создаем нужный нам класс с переопределенной функцией.
А тогда следующий вопрос: ведь вместо того, чтобы создать анонимный класс, мы
можем определить наследника явно и использовать его экземпляр. Как я сейчас
понимаю, анонимные классы используются лишь для упрощения записи, т.е. чтобы не
было лишней писанины (не надо было бы определять явно наследовать у класса,
которому можно сделать анонимного наследника).
Есть ли применения у анонимного класса, которые нельзя было бы сделать явными
наследниками.
Или это sintax sugar?
Yours sincerely, Sergei Kozello.
AM>> Если же речь идет о параметризации некоторого действия виртуальным
AM>> методом - то делается "в лоб":
AM>> do_something (fun () ->
AM>> printf "global=%d" global;
AM>> printf "local=%d" local
AM>> )
SK> Я здесь видимо привел слишком упрощенный пример. Я имел в виду что-то
SK> типа применения шаблона Template как сделано в классе Thread:
SK> переопределяем метод run() и вызываем метод start();
SK> А замена действительно осуществляетс просто как ты сказал: вместо
SK> внутреннего класса создаем нужный нам класс с переопределенной функцией.
SK> А тогда следующий вопрос: ведь вместо того, чтобы создать анонимный
SK> класс, мы можем определить наследника явно и использовать его экземпляр.
SK> Как я сейчас понимаю, анонимные классы используются лишь для упрощения
SK> записи, т.е. чтобы не было лишней писанины (не надо было бы определять
SK> явно наследовать у класса, которому можно сделать анонимного наследника).
SK> Есть ли применения у анонимного класса, которые нельзя было бы сделать
SK> явными наследниками.
SK> Или это sintax sugar?
Вложенные классы - это вообще синтаксический сахар - виртуальная машина их не
содержит (объемлющий класс просто является неявным параметром конструктора
вложенного и запоминается в скрытом поле вложенного класса)
Что же до анонимных классов - то там существенно еще как раз то, что он
образует замыкание, а без этого замыкание придется расписывать явно передавая
все необходимое параметрами конструктора.
Другое дело, что без этого сахаравсе становится сяльно более громоздко.
Антон