ProgrammingAndroidデベロッパー / バックエンドデベロッパー

Kotlinにおける定数値(const val)とコンパイルタイム定数の初期化はどのように機能しますか?通常のvalとの違いは何ですか?制限事項は何ですか?アノテーションでの使用方法と、なぜconst valを必ずしも使用できない場合があるのかについても教えてください。

Hintsage AIアシスタントで面接を突破

回答

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のみです。

型の制限を知らなかったため、コンパイルエラーと時間のロスが発生しました。