web-dev-qa-db-ja.com

Scalaでは、最終valとvalの違い

Scalaの違いは何ですか

val a = 1

そして

final val fa = 1
41
elm

finalメンバーは、たとえばサブクラスまたはトレイトでオーバーライドできません。

法的:

class A {
    val a = 1
}

class B extends A {
    override val a = 2
}

違法:

class A {
    final val a = 1
}

class B extends A {
    override val a = 2
}

次のようなエラーが表示されます。

:9:エラー:Int(1)型のクラスAの値aをオーバーライドします。

値aは最終メンバーをオーバーライドできません

56
Michael Zajac

Scalaでは、finalは、サブクラスでメンバーをオーバーライドできないことを宣言します。例えば:

class Parent {
  val a = 1
  final val b = 2
}

class Subclass extends Parent {
  override val a = 3 // this line will compile
  override val b = 4 // this line will not compile
}

また、 で説明されているように、「プライベートval」と「プライベートファイナルval」が異なるのはなぜですか?final valフィールドに「定数のプリミティブ型である定数値」へのアクセスは、その値を直接読み込むためのバイトコードに置き換えられます。

11

また、(Java)注釈でfinalvals以外を使用することはできません。

たとえば、これ:

@GameRegistry.ObjectHolder(Reference.MOD_ID)
object ModItems{
}

MOD_IDfinalとして宣言されます。

2
Jin