Kotlinのconstとvalの違いを徹底解説!正しい使い分けのポイント
Kotlinでは、読み取り専用の変数を宣言する方法として「const」と「val」の2つが用意されています。どちらも不変(イミュータブル)な値を扱うためのキーワードですが、初期化されるタイミングや代入できる値に明確な違いがあります。本記事では、それぞれの特徴と使い分けのポイントをコード例とともにわかりやすく解説します。
constキーワードとは
constは、アプリケーションのライフサイクル全体を通じて値が変わらない定数を宣言するために使われるキーワードです。constはクラスの不変(read-only)プロパティに対してのみ適用でき、シンプルに言えば「クラスの読み取り専用プロパティを宣言する」ためのものです。
const変数には、以下のような制約があります。
- constはクラスの不変プロパティにのみ適用できます。
- 関数の呼び出し結果やクラスのコンストラクタを代入することはできません。代入できるのはプリミティブ型またはString型のみです。
- const変数はコンパイル時に初期化されます。
- トップレベル(ファイル直下)またはobject宣言の中でのみ使用でき、ローカル変数としては宣言できません。
コード例
次の例では、const変数を宣言し、アプリケーション内で利用しています。
const val sName = "tutorialspoint"
// 関数呼び出しの結果をconstに代入することはできないため、
// 次の行はコンパイルエラーになる
// const val myFun = MyFunc()
fun main() {
println("Example of Const-Val--->" + sName)
}
実行結果
Example of Const-Val--->tutorialspoint
valキーワードとは
valも変数を宣言するためのキーワードで、「val」と「const val」はどちらもクラスの読み取り専用プロパティを宣言するために使われます。ただし、valで宣言された変数は実行時(ランタイム)に初期化される点が大きな違いです。
- valはクラスの不変プロパティを扱い、読み取り専用の変数のみを宣言できます(再代入不可)。
- valは実行時に初期化されます。
- 参照先のオブジェクトが可変(ミュータブル)な場合、valでも中身の状態は変更できます。一方、const valはプリミティブ型・String型に限定されるため、内容の変更は一切できません。
コード例
先ほどの例を修正して、valを使って関数の戻り値を代入してみます。今度は実行時にもコンパイル時にもエラーは発生しません。
const val sName = "tutorialspoint"
// valなら関数の戻り値を代入できる
val myFun = MyFunc()
fun main() {
println("Example of Const-Val--->" + sName)
println("Example of Val--->" + myFun)
}
fun MyFunc(): String {
return "Hello Kotlin"
}
実行結果
このコードを実行すると、次の出力が得られます。
Example of Const-Val--->tutorialspoint Example of Val--->Hello Kotlin
constとvalの違いまとめ
| 項目 | const val | val |
|---|---|---|
| 初期化タイミング | コンパイル時 | 実行時 |
| 代入できる値 | プリミティブ型・String型のみ | 任意のオブジェクトや関数の戻り値 |
| 宣言できる場所 | トップレベルまたはobject内 | どこでも可能(ローカル変数も含む) |
| 内容の変更 | 不可 | 参照先が可変オブジェクトなら状態変更は可能 |
プログラム全体で固定の定数(APIキーや設定値など)であればconst valを、実行時に決まる値やオブジェクトへの不変の参照にはvalを使うのが基本的な使い分けです。両者の特性を理解しておくと、より安全で読みやすいKotlinコードを書けるようになります。
-
DirectX11とDirectX12の違いを徹底解説!ゲーマーが知っておくべきポイント
DirectXは、ソフトウェアがマルチメディアコンテンツを描画し、グラフィックハードウェアと通信するために使用されるAPI(アプリケーションプログラミングインターフェース)のコレクションです。DirectXの主要な構成要素であるDirect3Dは、ソフトウェアとグラフィックスハードウェア間の通信を担っています。ハードウェアは製品ごとに異なるため、標準化された関数や呼び出しのライブラリを通じてグラフィックカードと通信することで、ゲーム開発を大幅にスピードアップできます。これは「ハードウェア抽象化」と呼ばれ、APIの最も重要な役割となっています。車に例えてみましょう。1台の車の運転ができれば、ほぼ
-
【C/C++】const int*、const int* const、int const* の違いをわかりやすく解説
C言語やC++では、ポインタとconst修飾子の組み合わせ方によって、複数の異なる変数宣言が存在します。「const int*」「const int* const」「int const*」など、一見よく似たこれらの宣言の違いを正確に理解することは、安全でバグの少ないコードを書くうえで非常に重要です。本記事では、これら3つの宣言の違いを、複雑な宣言を読み解く際に役立つ「時計回り/らせんルール(Clockwise/Spiral Rule)」にも触れながら、コード例とともに分かりやすく解説します。時計回り/らせんルールとは宣言の中心にある識別子から出発し、時計回りに記号をなぞっていくことで、cons