Re: Collections forAll
Добавлено: 26 мар 2007, 19:02
Нормальные люди конечно использовали бы callback-функции или делегаты, но к сожалению этот аспект Джавы - не для нормальных людей. Анонимные классы - это тоже не очень хорошая вешь, так как с точки зрения JVM это самые обычные классы, которые имеют имена типа package.OuterClass$1 и неявный спецконструктор который сохраняет ссылку на охватывающий класс в одном из неявных полей инстанса этого класса. А каждый класс отжирает 3Кб ОЗУ у JVM.Oscar писал(а):Это-то можно, но для того, чтобы "пробежать" по всем элементам списка, нужен какой-то способ. Как я писал в начале - либо это Iterator, либо через классы - Visitor_ы.
То есть я правильно тебя понял, что нормальные люди делают это именно через анонимные классы, типа "Print extends ForAll" ?
Проблема с немецким проектом была в том, что проект SWING'овый, и нужно было биндить кучу хандлеров элементов GUI к их обработчикам на фреймах, и немцы боялись что X*3КБ это очень большая величина при большом X. По моему это был FUD поскольку для GUI число X не может быть большим.
В нашем случае Mainstream подход состоит в том, чтобы в get - методе возвращать клон объекта либо ограничивающий декоратор.
На С++ с этим тоже кариес порядочный. Можно сделать красивые делегаты наподобие boost::function, но принцип работы этого самого boost::function совсем некрасивый. Не говоря о том, что это один большой хак. Вызов метода через такой "указатель" состоит из работы boost :: function :: operator(), вызова виртуального метода и вызова целевого метода через C++ указатель на метод.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 :-)
Еще на C++ есть boost::lambda для создания анонимных функций, но это еще большее нагромождение хаков. Точку с запятой забыл поставить - и превед.