Kotlinでは、const valキーワードを使用してコンパイルタイム定数を宣言します。つまり、コンパイル時に既知で計算される値です。
const valはトップレベル変数、またはobjectオブジェクトやcompanion objectで宣言されたプロパティにのみ使用できます。String、数値のプリミティブまたはBoolean。valは不変の変数ですが、値は実行時に設定できるため、初期化中に計算や関数の呼び出しを許可します:
val timestamp = System.currentTimeMillis() // これはconst valではありません const val APP_NAME = "MyApp" // これはコンパイルタイム定数です
アノテーションではconst valのみを使用できます。例:
const val AUTHOR = "John Doe" @Target(AnnotationTarget.CLASS) annotation class Author(val name: String) @Author(AUTHOR) class Example
このような場合にvalを使用しようとすると、コンパイルエラーが発生します。
なぜ通常のクラス内に
const valを宣言できないのですか?
回答: const valは変数がコンパイル時にアクセス可能である必要がありますが、クラスのインスタンス変数はオブジェクトの作成時のみ初期化されるため、コンパイルタイム定数にはできません。
class Example { // エラー!このようにはできません // const val CLASS_NAME = "MyClass" }
歴史
開発者がアノテーションを通じて実行時に計算された値を渡そうとしたため、ビルドが失敗しました。
開発者は次のように宣言しました:
val version = getVersionFromConfig() @Target(AnnotationTarget.CLASS) annotation class Version(val value: String) @Version(version) class App
プロジェクトはコンパイルされませんでした。なぜなら、アノテーションの引数に使用できるのはconst valだけだからです!
歴史
Androidでのエラー:Intentの定数キーとしてローカル変数を使用しようとした場合。
class Keys { companion object { val EXTRA_USER_ID = "userId" } } intent.putExtra(Keys.EXTRA_USER_ID, userId)
一部のツールやフレームワークでは、通常のvalではなくconst valが期待されるため、そうでない場合、IDEやAndroidリソースはこれらの値をコンパイルタイム定数として認識できません。
歴史
const valに不適切な型を使用しました。
const val LIST = listOf(1,2,3) // エラー!プリミティブとStringのみです。
型の制限を知らなかったため、コンパイルエラーと時間のロスが発生しました。