TLDR: いいえ、あまり良くありませんが、コンパイラをガイドすることはできます。
そして、チェックするのは簡単です (コードを test.scala に入れました):
scalac test.scala
javap Foo.class
// Compiled from "test.scala"
// public class Foo {
// public int BUFFER_SIZE();
// public byte[] buffer();
// public Foo();
// }
したがって、val は getter メソッドになります。実際のバイトコードを見てみましょう。
javap -c Foo.class
Compiled from "test.scala"
public class Foo {
public int BUFFER_SIZE();
Code:
0: aload_0
1: getfield #15 // Field BUFFER_SIZE:I
4: ireturn
// .... irrelevant parts
ご覧のとおりgetfield
、すべてのクラス インスタンスに個別のインスタンスが存在することを意味するコードがあります (getstatic
静的変数へのアクセスを意味します)。高度に最適化されたコードは次のようになります
public final int BUFFER_SIZE();
Code:
0: sipush 1024
3: ireturn
final
修飾子で BUFFER_SIZE をマークすると生成されます。
class Foo {
final val BUFFER_SIZE = 1024
val buffer = new Array[Byte](BUFFER_SIZE)
}
private[this]
@ghikが言ったようにフィールドにプレフィックスを付けると、同様にうまくいきます。違いは、final
単純なコードでゲッターを生成するのに対し、private[this]
値を直接インライン化することです。