Changes for page WebObjects with Scala
Last modified by Ravi Mendis on 2011/05/10 02:10
To version 509.1
edited by Ravi Mendis
on 2010/12/24 01:42
on 2010/12/24 01:42
Change comment:
There is no comment for this version
Summary
-
Page properties (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -1,19 +1,15 @@ 1 1 === What is Scala? === 2 2 3 -[[Scala>>http://en.wikipedia.org/wiki/Scala_(programming_language)]] is a language for concurrent computing. 4 -In this day and age of multi-core processors, concurrent computing can't be ignored. 3 +[[Scala>>http://www.scala-lang.org/]] is a modern, multi-paradigm JVM language that is most often compared to [[Groovy>>http://en.wikipedia.org/wiki/Groovy_(programming_language)]], [[Clojure>>http://en.wikipedia.org/wiki/Clojure]] or [[Erlang>>http://en.wikipedia.org/wiki/Erlang_(programming_language)]]. Its [[functional language>>http://en.wikipedia.org/wiki/Functional_programming]] foundations and built-in [[Actors>>http://en.wikipedia.org/wiki/Actor_model]] library make it especially attractive for concurrent computing. (Scala is an abbreviation for "scalable" hinting at its design goals). In this day and age of multi-core processors concurrent computing can not be ignored. 5 5 6 -Many of Scala's features have been designed with concurrency in mind. 7 -Some of these may not be unfamiliar to Objective-C or WebObjects developers. 5 +Many of the design features of Scala have been chosen with concurrency in mind, some of which may not be unfamiliar to Objective-C or WebObjects developers. Here's a summary: 8 8 9 -Here's a quick summary: 10 - 11 11 |= |= Objective-C |= Java |= Scala 12 -|= Separation of Mutable &ImmuableDatatypes|Collections //e.g: NSArray/NSMutableArray// | No | Yes13 -|= Closures | Blocks (//Extension//) | No | Anonymous Functions 8 +|= Immutability | Partial - via collections //e.g: NSArray/NSMutableArray// | No | Yes 9 +|= Closures | Yes - via Blocks (//Extension//) | No | Yes - via Anonymous Functions 14 14 |= Static variables | Yes | Yes | No 15 -|= Static methods or functions| Yes | Yes | No16 -|= Concurrency | [[Grand Central Dispatch>>http://en.wikipedia.org/wiki/Grand_Central_Dispatch]] (//Extension//) | //Threads// | [[Actors>>http://en.wikipedia.org/wiki/Actor_model]] 11 +|= Static methods | Yes | Yes | No 12 +|= Concurrency | Yes - via [[Grand Central Dispatch>>http://en.wikipedia.org/wiki/Grand_Central_Dispatch]] (//Extension//) | //Yes - via Threads// | Yes - via [[Actors>>http://en.wikipedia.org/wiki/Actor_model]] 17 17 |= |= Weakly Typed |= --Strongly Typed-- |= Strongly Typed 18 18 19 19 Other notable features include: ... ... @@ -20,20 +20,23 @@ 20 20 21 21 |= |= Objective-C |= Java |= Scala 22 22 |= Parametered methods | Yes //e.g: addObject: to~:// | No | Yes //e.g: add(object= ,to=)// 23 -|= Class composition | Categories | Interfaces | Traits 19 +|= Class composition | Yes - via Categories | Yes - via Interfaces | Yes - via [[Traits>>http://en.wikipedia.org/wiki/Trait_(computer_science)]] 24 24 25 25 === Why Use Scala? === 26 26 27 -Scala is inherently thread-safe. 28 -It has concurrency that is effectively built-in to the language. 23 +For WebObjects developers, Scala offers itself as a powerful, safe and easy-to-use solution for [[concurrent computing>>Building Concurrent Applications with WebObjects and Scala]]. (In other words, Scala Actors can be used for problems that would have normally required threads). 29 29 30 -So for WebObjects developers, Scala offers itself as a powerful, safe and easy-to-use solution for [[concurrent applications>>Building Concurrent Applications with WebObjects and Scala]]. (In other words, Scala Actors can be used for problems that would have normally required threads). 31 - 32 32 === Can WebObjects be Programmed In Scala? === 33 33 34 34 Yes. It is very simple. 35 -Scala compiles to java bytecode. Hence using it with WebObjects is fairly straightforward.28 +By virtue of being a JVM-language, Scala compiles to java bytecode. 36 36 30 +Furthermore, being a multi-paradigm language grants Scala easy WebObjects-interoperability. 31 + 32 +===== Caveats ===== 33 + 34 +Legacy tool support is often cited as a weak point. The [[Eclipse Scala plugin>>http://www.scala-ide.org]] has been found to be slow at times and sometimes buggy. 35 + 37 37 = WebObjects In Scala = 38 38 39 39 The following highlights some of the differences between Java and Scala in WebObjects: ... ... @@ -44,7 +44,8 @@ 44 44 45 45 Scala doesn't have static variables or methods. Instead Scala employs the [[Singleton Pattern>>http://en.wikipedia.org/wiki/Singleton_pattern]] which is built into the language and is **thread-safe**: a class can have a //Companion Object// that will allow you to achieve something equivalent to static variables - but better. 46 46 47 -So you don't have to worry about synchronizing access to shared mutable fields in a concurrent application. 46 +You don't have to worry about synchronizing access to shared mutable fields in a concurrent application. 47 +(This is not however true when for example you have a ##val## declared as a ##NSMutableArray##. You will still have to synchronize when adding to or removing from this mutable field). 48 48 49 49 The following is an example of the use of a //Companion Object// for Talent in Scala instead of Talent static fields in Java. 50 50 ... ... @@ -61,7 +61,7 @@ 61 61 62 62 {{code}} 63 63 64 -object Talent extends EOGenericRecord{64 +object Talent { 65 65 val ENTITY_NAME = "Talent" 66 66 67 67 {{/code}} ... ... @@ -76,8 +76,6 @@ 76 76 77 77 ==== Compacted imports ==== 78 78 79 -Two lines in Java are compacted into one in Scala. 80 - 81 81 In Java: 82 82 83 83 {{code value="java"}} ... ... @@ -188,42 +188,25 @@ 188 188 189 189 == How to Use Scala Collections with EOF == 190 190 191 -One of the benefits of Scala is its very powerful, concurrency-ready collection classes - primarily ##List##, ##Map## and ##Set##. 192 -Employing these instead of ##NSArray## and ##NSDictionary## in WebObjects/EOF may be challenging. 189 +To use the Scala Collections API with an NSArray or NSDictionary you simply need to add an import: 193 193 194 - Butone may modify theEO templates to produceAPI suchas:191 +{{code value="java"}} 195 195 196 -{{code}} 197 - 198 198 import scala.collection.JavaConversions._ 199 199 200 -def movies = { 201 - storedValueForKey(_Studio.Keys.MOVIES).asInstanceOf[NSArray[Movie]] 202 -} 203 - 204 -def moviesList = { 205 - movies.asInstanceOf[java.lang.Iterable[Movie]].toList 206 -} 207 - 208 208 {{/code}} 209 209 210 -This employs a feature of Scala known as **implicit conversions**to automagically convert a NSArray (a Java Iterable) into a Scala Iterable.197 +After that, you may access the typical Scala collection methods directly on NSArray. This employs a feature of Scala known as implicit conversions to automagically cast a NSArray (a Java Iterable) into a Scala Iterable while leaving the actual object unchanged. 211 211 212 -== How to Add Scala to a WO Project == 199 +== How to Add Scala to a WO Project (in Eclipse) == 213 213 214 214 {{include value="WOL:Adding Scala Support to a WOLips Project"}}{{/include}} 215 215 216 -{{note}} 217 - 218 -This is for Eclipse/WOLips IDE 219 - 220 -{{/note}} 221 - 222 222 == WO Scala Example == 223 223 224 224 The following example is an almost 100% Scala WO app. In reality it is a mixed Java/Scala app: 225 225 All the EO logic and WO components are in Scala. 226 -Only the Application class is Java. 207 +Only the Application class remains Java. 227 227 228 228 It is based on the D2W Movies example. 229 229 ... ... @@ -234,6 +234,12 @@ 234 234 1. [[Install the Scala eclipse IDE>>http://www.scala-ide.org/]] 235 235 1. Right-click on Application.java and run as a WOApplication (as usual). 236 236 218 +{{note}} 219 + 220 +Application can be made into a Scala class as well, but then you will have to create a launcher in Eclipse manually. 221 + 222 +{{/note}} 223 + 237 237 == EO Templates == 238 238 239 239 When you create your ##.eogen## file, be sure to make the following changes in the EOGenerator Editor: