Search code examples
scalaconstructorfinal

Scala final variables in constructor


I'm still pretty new to Scala, but I know you can define class variables that are initialized in the constructor like

class AClass(aVal: String)

which would be like doing the following in java

class AClass {
    private String aVal;

    public AClass(String aVal) {
        this.aVal = aVal;
    }
}

In Java, I would declare aVal as final. Is there a way to make the aVal variable final in the Scala syntax?

EDIT: Here is what I am seeing when I compile the following Scala class:

class AClass(aVal: String) {
  def printVal() {
    println(aVal)
  }
}

I ran javap -private and got the output

public class AClass extends java.lang.Object implements scala.ScalaObject{
  private final java.lang.String aVal;
  public void printVal();
  public AClass(java.lang.String);
}

When I change the scala class definition to have class AClass(**val** aVal: String) I get the following output from javap -private

public class AClass extends java.lang.Object implements scala.ScalaObject{
  private final java.lang.String aVal;
  public java.lang.String aVal();
  public void printVal();
  public AClass(java.lang.String);
}

The public method aVal is generated. I'm still learning here - can anyone explain why that is generated?

Note I am using scala 2.9


Solution

  • class AClass(aVal: String)
    

    In this code, aVal is a final variable. So You already have a final variable.

    class AClass(val aVal: String)
    

    In this code, aVal is final and you have getter of aVAl. So you can use it like below

    scala> val a= new AClass("aa")
    a: A1 = A1@1d7d58f
    
    scala> a.aVal
    res2: String = aa
    

    And finally,

    class AClass(var aVal: String)
    

    In this code, aVal is not final and you have getter and setter of aVal. So you can use it like below

    scala> val a= new AClass("aa")
    a: AClass = AClass@1c059f6
    
    scala> a.aVal
    res3: String = aa
    
    scala> a.aVal = "bb"
    a.aVal: String = bb
    
    scala> a.aVal
    res4: String = bb