tags:

views:

378

answers:

1

Hi StackOverflow!

I have this rather simple question about Scala. Given that i have to following class definition:

class Foo(var bar: Int)

The code which is able to construct an instance of Foo must be able to pass the initial value for bar. But if I define bar as var the User is also able to change its value at runtime which is not what I want. The User should only be able to read bar. bar itself is modified internally so a val is not an option.

I think I might be getting an answer very soon as this question is so simple. :-)

Cheers, Malax

+11  A: 

Read-only for a property is easy, just create a getter method without the corresponding setter. It's also easy to make a private modifiable field.

Your biggest challenge here is the shared namespace, you want to be able to use the same name for:

  • the constructor param
  • the internal modifiable field
  • the public getter
  • the private setter

Sadly, this is not possible, and you need a distinct name for each role... something like this:


class Foo(bar0: Int) {
  private[this] var privatebar = bar0
  //privatebar is ONLY EVER used by the following getter and setter:
  private def bar_=(x:Int) = privatebar = x
  def bar = privatebar
}

If you're not concerned about using named arguments, or with the name of the argument in Scaladoc, then this can be shortened even further:


class Foo(private[this] var privatebar) {
  //privatebar is ONLY EVER used by the following getter and setter:
  private def bar_=(x:Int) = privatebar = x
  def bar = privatebar
}

Kevin Wright
Nice answer, thank you a lot!
Malax