These are apparently generated in scala automatically for any parameters in constructors (which I suppose also implies that they can be added manually somewhere else) but what are these things?
Accessor and mutator methods are normal methods with special names. Look at the following example:
class A {
var x: Int = _
}
Is the same as (as in "the compiler generates the following"):
class A {
private[this] var internal: Int = _
// this is the accessor
def x: Int = internal
// this is the mutator
def x_=(x: Int): Unit = internal = x
}
When you write or read x, the following happens:
val a: A = ???
println(a.x) // -> method x on A is called
a.x = 1 // syntactic sugar for a.x_=(1)
The nice thing about this is, that you can change a var at a later point in time to include, say, consistency checks:
class A {
private[this] var _x: Int = _
def x: Int = _x
def x_=(x: Int): Unit = {
if (x < 0)
throw new IllegalArgumentException("Must be non-negative")
_x = x
}
}
The ability to replace variables by accessors/mutators transparently is also known as uniform access principle.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With