Страница 2 из 2

Re: Collections forAll

Добавлено: 26 мар 2007, 19:02
Absurd
Oscar писал(а):Это-то можно, но для того, чтобы "пробежать" по всем элементам списка, нужен какой-то способ. Как я писал в начале - либо это Iterator, либо через классы - Visitor_ы.

То есть я правильно тебя понял, что нормальные люди делают это именно через анонимные классы, типа "Print extends ForAll" ?
Нормальные люди конечно использовали бы callback-функции или делегаты, но к сожалению этот аспект Джавы - не для нормальных людей. Анонимные классы - это тоже не очень хорошая вешь, так как с точки зрения JVM это самые обычные классы, которые имеют имена типа package.OuterClass$1 и неявный спецконструктор который сохраняет ссылку на охватывающий класс в одном из неявных полей инстанса этого класса. А каждый класс отжирает 3Кб ОЗУ у JVM.

Проблема с немецким проектом была в том, что проект SWING'овый, и нужно было биндить кучу хандлеров элементов GUI к их обработчикам на фреймах, и немцы боялись что X*3КБ это очень большая величина при большом X. По моему это был FUD поскольку для GUI число X не может быть большим.

В нашем случае Mainstream подход состоит в том, чтобы в get - методе возвращать клон объекта либо ограничивающий декоратор.
Oscar писал(а): Всё дело в том, что в одной немецкой библиотеке (LEDA), правда на языке C, есть следующая конструкция:

[syntax="c"] node v;

forall_nodes(v,G)
if ( !reached[v] ) {
S = DFS(G,v,reached);
forall(w,S) compnum[w] = count;
count++;
}[/syntax]

Я не знаю даже как на Си это реализовать, а хотелось бы именно такое написать на Java :-)
На С++ с этим тоже кариес порядочный. Можно сделать красивые делегаты наподобие boost::function, но принцип работы этого самого boost::function совсем некрасивый. Не говоря о том, что это один большой хак. Вызов метода через такой "указатель" состоит из работы boost :: function :: operator(), вызова виртуального метода и вызова целевого метода через C++ указатель на метод.

Еще на C++ есть boost::lambda для создания анонимных функций, но это еще большее нагромождение хаков. Точку с запятой забыл поставить - и превед.

Re: Collections forAll

Добавлено: 27 мар 2007, 01:37
Absurd
Прошу прощение, если объяснение получилось путаным, но отсутствие в Джаве нормальных указателей на функции меня обескураживает. Я сам иногда вынужден подолгу обдумувать интерфейс класса, выбирая из плохих и очень плохих вариантов в том случае если мне нужно чего-то callback-образное со строгой типизацией. Хороших ответов тут нет