Changes for page WebObjects with Scala
Last modified by Ravi Mendis on 2011/05/10 02:10
From version 511.1
edited by Ravi Mendis
on 2010/12/24 01:36
on 2010/12/24 01:36
Change comment:
There is no comment for this version
Summary
-
Page properties (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -1,15 +1,19 @@ 1 1 === What is Scala? === 2 2 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. 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. 4 4 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: 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. 6 6 9 +Here's a quick summary: 10 + 7 7 |= |= Objective-C |= Java |= Scala 8 -|= Immu tability| Partial-via collections //e.g: NSArray/NSMutableArray// | No | Yes9 -|= Closures | Yes - viaBlocks (//Extension//) | No |Yes - viaAnonymous Functions12 +|= Separation of Mutable & Immuable Datatypes | Collections //e.g: NSArray/NSMutableArray// | No | Yes 13 +|= Closures | Blocks (//Extension//) | No | Anonymous Functions 10 10 |= Static variables | Yes | Yes | No 11 11 |= Static methods or functions | Yes | Yes | No 12 -|= Concurrency | Yes - via [[Grand Central Dispatch>>http://en.wikipedia.org/wiki/Grand_Central_Dispatch]] (//Extension//) | //Yes - viaThreads// |Yes - via [[Actors>>http://en.wikipedia.org/wiki/Actor_model]]16 +|= Concurrency | [[Grand Central Dispatch>>http://en.wikipedia.org/wiki/Grand_Central_Dispatch]] (//Extension//) | //Threads// | [[Actors>>http://en.wikipedia.org/wiki/Actor_model]] 13 13 |= |= Weakly Typed |= --Strongly Typed-- |= Strongly Typed 14 14 15 15 Other notable features include: ... ... @@ -16,23 +16,20 @@ 16 16 17 17 |= |= Objective-C |= Java |= Scala 18 18 |= Parametered methods | Yes //e.g: addObject: to~:// | No | Yes //e.g: add(object= ,to=)// 19 -|= Class composition | Yes - viaCategories |Yes - viaInterfaces |Yes - via [[Traits>>http://en.wikipedia.org/wiki/Trait_(computer_science)]]23 +|= Class composition | Categories | Interfaces | Traits 20 20 21 21 === Why Use Scala? === 22 22 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). 27 +Scala is inherently thread-safe. 28 +It has concurrency that is effectively built-in to the language. 24 24 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 + 25 25 === Can WebObjects be Programmed In Scala? === 26 26 27 27 Yes. It is very simple. 28 - By virtue of being a JVM-language,Scala compiles to java bytecode.35 +Scala compiles to java bytecode. Hence using it with WebObjects is fairly straightforward. 29 29 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 - 36 36 = WebObjects In Scala = 37 37 38 38 The following highlights some of the differences between Java and Scala in WebObjects: ... ... @@ -43,8 +43,7 @@ 43 43 44 44 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. 45 45 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). 47 +So you don't have to worry about synchronizing access to shared mutable fields in a concurrent application. 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 { 64 +object Talent extends EOGenericRecord { 65 65 val ENTITY_NAME = "Talent" 66 66 67 67 {{/code}} ... ... @@ -76,6 +76,8 @@ 76 76 77 77 ==== Compacted imports ==== 78 78 79 +Two lines in Java are compacted into one in Scala. 80 + 79 79 In Java: 80 80 81 81 {{code value="java"}} ... ... @@ -186,25 +186,42 @@ 186 186 187 187 == How to Use Scala Collections with EOF == 188 188 189 -To use the Scala Collections API with an NSArray or NSDictionary you simply need to add an import: 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. 190 190 191 - {{codevalue="java"}}194 +But one may modify the EO templates to produce API such as: 192 192 196 +{{code}} 197 + 193 193 import scala.collection.JavaConversions._ 194 194 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 + 195 195 {{/code}} 196 196 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 Iterablewhile leaving the actual object unchanged.210 +This employs a feature of Scala known as **implicit conversions** to automagically convert a NSArray (a Java Iterable) into a Scala Iterable. 198 198 199 -== How to Add Scala to a WO Project (in Eclipse)==212 +== How to Add Scala to a WO Project == 200 200 201 201 {{include value="WOL:Adding Scala Support to a WOLips Project"}}{{/include}} 202 202 216 +{{note}} 217 + 218 +This is for Eclipse/WOLips IDE 219 + 220 +{{/note}} 221 + 203 203 == WO Scala Example == 204 204 205 205 The following example is an almost 100% Scala WO app. In reality it is a mixed Java/Scala app: 206 206 All the EO logic and WO components are in Scala. 207 -Only the Application class remains Java.226 +Only the Application class is Java. 208 208 209 209 It is based on the D2W Movies example. 210 210 ... ... @@ -215,12 +215,6 @@ 215 215 1. [[Install the Scala eclipse IDE>>http://www.scala-ide.org/]] 216 216 1. Right-click on Application.java and run as a WOApplication (as usual). 217 217 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 - 224 224 == EO Templates == 225 225 226 226 When you create your ##.eogen## file, be sure to make the following changes in the EOGenerator Editor: