user unknown
user unknown

Reputation: 36269

initialise a var in scala

I have a class where I like to initialize my var by reading a configfile, which produces intermediate objects/vals, which I would like to group and hide in a method. Here is the bare minimum of the problem - I call the ctor with a param i, in reality a File to parse, and the init-method generates the String s, in reality more complicated than here, with a lot of intermediate objects being created:

class Foo (val i: Int) {

    var s : String;

    def init () {
        s = "" + i 
    }

    init ()
}

This will produce the error: class Foo needs to be abstract, since variable s is not defined. In this example it is easy to solve by setting the String to "": var s = "";, but in reality the object is more complex than String, without an apropriate Null-implementation.

I know, I can use an Option, which works for more complicated things than String too:

var s : Option [String] = None

def init () {
    s = Some ("" + i) 
}

or I can dispense with my methodcall. Using an Option will force me to write Some over and over again, without much benefit, since there is no need for a None else than to initialize it that way I thought I could.

Is there another way to achieve my goal?

Upvotes: 16

Views: 15784

Answers (3)

egervari
egervari

Reputation: 22522

Honestly, why are you using var? Why not just do:

val rootObject = readFile(filename)

This would make the most sense to me.

Upvotes: 0

missingfaktor
missingfaktor

Reputation: 92106

Instead of creating separate methods for initialization, you should perform the initialization using the following way :

class Foo(val i: Int) {
  var s: String = {
    var s0 = " "
    s0 += i
    // do some more stuff with s0
    s0
  }

  var dashedDate = {
    val dashed = new SimpleDateFormat("yy-MM-dd")
    dashed.format(updated)
  }

  // Initializing more than one field:
  var (x, y, z) = {
    var x0, y0, z0 = 0
    // some calculations
    (x0, y0, z0)
  }
}

Upvotes: 18

sepp2k
sepp2k

Reputation: 370435

var s : Whatever = _ will initialize s to the default value for Whatever (null for reference types, 0 for numbers, false for bools etc.)

Upvotes: 19

Related Questions