Java, Groovy & Scala: side to side 2
Posted By: Andres Almiray on Thu. Jun. 12, 2008
Second part of the series, (first part here). Thanks a lot to Daniel Spiewak who took the time to expand the topics presented about Scala. Without further ado...
Feature
|
Java
|
Groovy
|
Scala
|
Instance Fields
|
[access_modifier] Type name
where access_modifier is any of
|
[access_modifier] Type name
where access_modifier is any of
If no access modifier is provided then the field would be promoted to a property. Properties have their get/set methods auto generated in bytecode which means that the following Groovy class
class
Person { String name }
Is equivalent to the following Java class
public class
Person { private String name;
public
void
setName( String name ) {
this
.name = name; }
public
String getName() { return name; } }
|
[access_modifier] [definition] name: Type
where access_modifier is any of
where definition is any of
private
works as in Java
protected
baffles me, as a subclass can't access its parent's protected fields (perhaps I missed something here), same thing with empty access modifier (strong encapsulation?)
|
Class Fields (static)
|
[access_modifier]
static
Type name
where access_modifier is any of
|
[access_modifier]
static
Type name
where access_modifier is any of
|
No static modifier (?) but
object
can be used
object
Foo {
val
aConstant = "Foo"
private
var
seed = 42
def
foo() = { seed += 1; seed - 1 } }
object
Bar {
import
Foo._
def
main(args: Array[String]) {
var
bar = foo() println( aConstant ) // Foo println( bar ) // 42 println( foo() ) // 43 } }
|
Global Variables
|
Not supported. Every field/constant must belong to a class
|
Supported only in scripts, otherwise follows Java rules
|
Not supported. Every field/constant must belong to a class
|
Method definition
|
class
Person { [access_modifier] Type name() { // statements } }
where access_modifier is any of
|
class
Person { [access_modifier] Type name() { // statements } }
where access_modifier is any of
|
class
Person { [access_modifier]
def
name() [:Type] = { // statements } }
where access_modifier is any of
The type of the method may be optional No-arg methods can be written and called without parens
class
Person {
def
name = { "Scala" } } ... // this is a method call
new
Person().name
|
Static Method Definition
|
class
Person { [access_modifier]
static
Type name() { // statements } }
where access_modifier is any of
|
class
Person { [access_modifier]
static
Type name() { // statements } }
where access_modifier is any of
|
Follows the rules of Class Fields and Method Definition
|
Returning from a method
|
return
expression;
return
;
|
Same as Java. But can leave the return statement - in that case the last expression evaluated is returned.
|
Same as Java. But can leave the return statement - in that case the last expression evaluated is returned.
|
Null
|
null
|
null
- Guillaume Laforge notes that "Null Object Pattern" is supported in Groovy. See also: NullObject. So, you can call null.toString() for example.
|
null
Which is actually of type
Null
, the only one of its kind. Can't call methods on it.
|
Arrays
|
int
[] a =
new
int[10]; a[0] = 3;
|
int
[] a =
new
int[10] a[0] = 3
|
var
a:Array[Int] =
new
Array(10) a(0) = 3
also
var
a =
new
Array[Int](10) a(0) = 3
|
Array Literals
|
int[]
a = {0,1,2}; a[0] = 3;
|
int
[] a = [0,1,2] a[0] = 3
|
val
nums = Array(0,1,2)
|
Lists
|
Supported by the Collections framefork (JSL), not really part of the language
|
List list = [0,1,2] list[0] = 'Foo' list[10] = 11
Lists can be heterogeneous Lists grow as needed
|
val
nums = List(1,2,3,4)
Lists are immutable, values can't be reassigned List are homogeneous
|
Hash Literals
|
Not supported. (See java.util.Map)
|
def
hash = [key:'value', 'id': 1] hash.key = 'value2' // bean like access hash[key] = 'value3' // hash like access
|
val
nums = Map("one" -> 1, "two" -> 2, "three" -> 3) nums("one") // 1 nums("two") // 2
Daniel explains: Scala does have a syntax for map literals (sort of), but it's not really built into the language. It's actually an implicit conversion on Any (common superclass of all objects incl. primitives) and a symbolic method.
|
http://groovygrails.com/gg/blog/view/123176;jsessionid=11297C7AB6F87D53BBBC1CEFBCA6B0AB.vhost01