final
セマンティクスを取得するには、初期状態をコンストラクターに渡します。
もう 1 つのモードは、初期定義を使用することです。BClass#strs が final であることに注意してください。
Final は、イニシャライザが完了したら、値を変更してはならないことを意味します。
そして可変状態を失います。
しかし、可変性が好きな場合や可変性が必要な場合は、コンパニオン オブジェクトのファクトリは、オブジェクトを構築するときに必要な正気度を問わず機能します。
package inheritthewind
object Test extends App {
val a = new AClass(new AInit { val str = "Pooya" })
a.aMethod()
val b = new {
val str: String = "Pooya"
} with BClass
b.aMethod()
val b2 = new BClass {
val str: String = "Pooya"
}
b2.aMethod() // uh no, result is "nulls"
val c = CClass(new CPrototype { val str = "Pooya" })
c.aMethod()
// not allowed
//val nope = new CClass
}
trait AInit {
def str: String
}
final class AClass(init: AInit) {
private final val str: String = init.str
def aMethod() = Console println str
}
abstract class BClass {
val str: String
final val strs = str + "s"
def aMethod() = Console println strs
}
trait CPrototype extends AInit
final class CClass private() {
private var str: String = _
def aMethod() = Console println str
}
object CClass {
def apply(p: CPrototype): CClass = {
val res = new CClass
res.str = p.str
res
}
}
と
scala> :javap -pv inheritthewind.BClass
[snip]
private final java.lang.String strs;
flags: ACC_PRIVATE, ACC_FINAL
public abstract java.lang.String str();
flags: ACC_PUBLIC, ACC_ABSTRACT
public final java.lang.String strs();
flags: ACC_PUBLIC, ACC_FINAL