Java, Groovy & Scala: side to side 2 - No Fluff Just Stuff

Java, Groovy & Scala: side to side 2

Posted by: Andres Almiray on June 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
  • public
  • protected
  • private
  • empty - means package protected [default access]
[access_modifier] Type name

where access_modifier is any of
  • public [default access]
  • protected
  • private
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
  • empty - [default access]
  • protected
  • private
where definition is any of
  • var - mutable
  • val - immutable (think final in Java)
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?)

update: a subclass does have access to its parent protected members, it so happens my tests were doing something unnexpected, more on that later.
Class Fields (static) [access_modifier] static Type name

where access_modifier is any of
  • public
  • protected
  • private
  • empty - means package protected [default access]
[access_modifier] static Type name

where access_modifier is any of
  • public
  • protected
  • private
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
  • public
  • protected
  • private
  • empty - means package protected [default access]
class Person {
  [access_modifier] Type name() {
    // statements
  }
}

where access_modifier is any of
  • public
  • protected
  • private
  • empty - same as public [default access]
class Person {
  [access_modifier] def name() [:Type] = {
    // statements
  }
}

where access_modifier is any of
  • protected
  • private
  • empty - public? [default access]
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
  • public
  • protected
  • private
  • empty - same as public [default access]
class Person {
  [access_modifier] static Type name() {
    // statements
  }
}

where access_modifier is any of
  • public
  • protected
  • private
  • empty - same as public [default access]
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.
Andres Almiray

About Andres Almiray

Andres is a Java/Groovy developer and a Java Champion with more than 20 years of experience in software design and development. He has been involved in web and desktop application development since the early days of Java. Andres is a true believer in open source and has participated on popular projects like Groovy, Griffon, and DbUnit, as well as starting his own projects (Json-lib, EZMorph, GraphicsBuilder, JideBuilder). Founding member of the Griffon framework and Hackergarten community event. https://ch.linkedin.com/in/aalmiray

Why Attend the NFJS Tour?

  • » Cutting-Edge Technologies
  • » Agile Practices
  • » Peer Exchange

Current Topics:

  • Languages on the JVM: Scala, Groovy, Clojure
  • Enterprise Java
  • Core Java, Java 8
  • Agility
  • Testing: Geb, Spock, Easyb
  • REST
  • NoSQL: MongoDB, Cassandra
  • Hadoop
  • Spring 4
  • Cloud
  • Automation Tools: Gradle, Git, Jenkins, Sonar
  • HTML5, CSS3, AngularJS, jQuery, Usability
  • Mobile Apps - iPhone and Android
  • More...
Learn More »