четверг, 17 января 2008 г.

Scala - первое впечатление

Technology stack: java, spring framework, maven, eclipse, jboss

Все состыковалось нормально, но разочарований пока больше:
1. Поддержка Scala в eclipse'е просто никакая. Подсвечивает двумя цветами, комплишенов нет, рефакторинга нет, навигации нет. Может я что-то не правильно сделал с плагином, но для первого впечатления я бы сказал, что поддержки вообще нет.

2. Maven2 нормально собирает Scala, но нужно обязательно Maven 2.0.7 или выше. Сначало собираются все Java классы, а потом Scala. Поэтому врятли получится из Java сослаться на Scala класс. Это в пределах одного проекта. Если нужно наоборот, то надо делать два разных под модуля. А если в перемешку охото - вообще не знаю как (правда и желание левое).

3. Spring'у вобще-то пофиг инстансы какого класса делать. Главное, чтобы геттеры были. Какой-то особенной поддержки для scala в спринге нет (в отличии от BSH, Groovy и еще чего-то (jruby или jpython)).

4. Каким-то странным образом Scala делает getter'еры и setter'ы для переменных класса. То делает, то нет. Например для java.lang.Map не сделала. А для scala.collection.jcl.Map - сделала что-то типа setVar... Я сначало губу расскатал, думаю вот, наконец то не надо геттеры и сеттеры руками делать. А хрен. По умолчанию не делает само. Если в еклипсе это хотя бы для джавы двумя кликами делается, то тут это еще и руками писать вида: def getVar () = var.

5. Про override не понял. В примере override нарисован - у меня он говорит мол не ожидаю я тут override увидеть....

6. Интеграция с Java. Думаю да, клево, есть imlicit методы - значит наверное все круто и просто. Нефига. Все равно врапперы надо делать, чтобы из java Map получить scala Map. И trait scala Map не совместим с interface java Map.

7. Пишу val pending : List[(=>Unit)] = Nil; Определил. А вот pending = (println "") :: pending -- ругается, что (println "") - это Unit, а ему нужен =>Unit. lazy val v = println "" и последующий pending = v :: pending; тоже самое. v видетели Unit. Забил, сделал val pending : List[() => Unit] = Nil ... но осадок остался.

Понятно, что часть этой фигни - по моей неопытности и незнанию и наверняка решается. Но всеже.. )
Из приятного: type inference это хорошо, замыкания это хорошо, карринг это хорошо. Экономия кода не большая по сравнению с джавой, но она есть. Код чище, если на врапперы не втыкать. А если использовать приемущественно одну Scala, то вообще красота по чистоте будет.

P.S. Тут на работе постоянно бухтят о коллбэках в моем API и пытаются от них избавится... :) А буть скала, было бы это scala:
helper.runInScope (scope) {
println ("Hello world");
}


вместо:
helper.runInScope (scope, new Callback0 () {
public void run () {
println ("hello world");
}
});


Но scala там не быть :))

Комментариев нет:

Отправить комментарий