How to expose a constructor variable(sic!) as read-only?

scala

Solution

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 Bippy(bop0: Int) {
  private[this] var privatebop = bop0
  //privatebop is ONLY EVER used by the following getter and setter:
  private def bop_=(x:Int) = privatebop = x
  def bar = privatebop
}

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 Bippy(private[this] var privatebop) {
  //privatebop is ONLY EVER used by the following getter and setter:
  private def bop_=(x:Int) = privatebop = x
  def bop = privatebop
}

UPDATE

The cleanest method, arguably, which gives you back named parameters is to combine a factory with one of the above techniques:

object Bippy{
  def apply(bop: Int) = new Bippy(bop)
}

Which can then be called as `Bippy(42)`. Just the same as the regular constructor, but without the `new` keyword.

Problem

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.

Original source