Путеводитель по Scala для Java-разработчиков: Не зацикливайтесь!

FAQ

До сих пор в публикациях этой серии я уделял основное внимание тесной связи Scala с экосистемой Java, демонстрируя вам то, как Scala включает в себя преобладающую часть объектной функциональности Java. Однако если бы Scala просто являлся другим способом написания объектов, он бы не представлял собой ничего интересного, а тем более выдающегося, как это есть на самом деле. Объединение в Scala функциональных и объектных концепций, усиленное акцентом на эффективность процесса программирования, ощутимо усложняет и замедляет изучение языка, что может быть неочевидно для начинающего Java/Scala-программиста.
Об этой серии

Тед Ньюорд погружается в язык программирования Scala и берет вас с собой. В этой новой серии от developerWorks вы узнаете, вокруг чего поднят такой шум, и увидите некоторые лингвистические возможности Scala в действии. Код Scala и код Java будут показаны бок о бок, если таковое сравнение будет важно. Правда, как скоро выяснится, многие вещи в Scala не могут быть напрямую соотнесены с чем-либо таким, что вам знакомо из Java-программирования, — но в этом и заключается основное очарование Scala! В конце концов, если что-то можно сделать на Java — зачем утруждать себя изучением Scala?

Например, рассмотрим принятый в Scala подход к реализации управляющих конструкций типа if, while и for. При том, что они могут выглядеть как привычные Java-конструкции, Scala наделяет их некоторыми уникальными характеристиками. Чтобы не подвергать вас риску исследования этих различий после того, как вы совершите кучу ошибок (и в результате напишете неработающий код), в статье за этот месяц предлагается изучить, чего следует ожидать при использовании управляющих структур в Scala.

Возвращаемся к Person.scala

В последней статье этой серии вы видели, как Scala позволяет определять POJO, задавая методы, имитирующие традиционные «getter-ы и setter-ы» необходимые для POJO-ориентированных сред. После публикации этой статьи я получил электронное письмо от Билла Веннерса (Bill Venners), соавтора готовящегося к выпуску канонического справочника по Scala Программирование на Scala (см. Ресурсы). Билл указал более простой способ достижения того же эффекта — использование аннотации scala.reflect.BeanProperty, скажем, так:

Листинг 1. Исправленный Person.scala
class Person(fn:String, ln:String, a:Int)
{
@scala.reflect.BeanProperty
var firstName = fn

@scala.reflect.BeanProperty
var lastName = ln

@scala.reflect.BeanProperty
var age = a

override def toString =
«[Person firstName:» + firstName + » lastName:» + lastName +
» age:» + age + » ]»
}

Приведенный в листинге 1 подход (переработанный листинг 13 из моей предыдущей статьи) генерирует get/set-пару методов для указанной переменной var. Единственная оговорка — такие методы в действительности не существуют в Scala-коде и, стало быть, не могут быть вызваны другими частями кода. Как правило, это не является большой проблемой поскольку Scala будет использовать сгенерированные методы вместо самостоятельно сгенерированных полей; но вы можете быть неприятно удивлены, если не будете знать об этом заранее.

Но что поразило меня больше всего при рассмотрении листинга 1, так это то, что Scala не просто демонстрирует мощь комбинирования функциональных и объектных концепций. Здесь также проявляются некоторые преимущества осмысленной работы над объектным языком, появившимся через тринадцать лет после первого релиза Java.