Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

÷ÏÐÒÏÓ: ÓÓÙÌËÁ ÎÁ ÆÕÎËÃÉÀ

1 view
Skip to first unread message

Sergei Kozello

unread,
Sep 5, 2003, 2:56:49 PM9/5/03
to
Hi, Anton..

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.

Anton Moscal

unread,
Sep 6, 2003, 5:35:49 AM9/6/03
to
Fri Sep 05 2003 23:56, Sergei Kozello wrote to Anton Moscal:


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?

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

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

Другое дело, что без этого сахаравсе становится сяльно более громоздко.

Антон

0 new messages