Kotlinでは、プログラム内で値が変わらないものを扱うために、主に次の3つの仕組みを使います。
var(変更可能な変数)val(再代入できない読み取り専用の値)const val(コンパイル時定数)
この中で「定数」として扱われることが多いのは val と const val ですが、厳密には意味が少し異なります。
Kotlinの基本:var / val / const val
まずはKotlinの基本となる変数と定数の考え方を整理します。
var(変更可能な変数)
var は値を変更できる変数です。
var count = 10
count = 20
このように再代入が可能です。
val(読み取り専用の値)
val は一度値を代入すると、その変数に 再代入できなくなる仕組みです。
val name = "Kotlin"
この場合、次のような再代入はできません。
name = "Java" // エラー
ただし、val は 必ずしも「定数」ではありません。val はあくまで「再代入できない値」であり、値が実行時に決まることもあります。
例えば次のコードです。
val time = System.currentTimeMillis()
この場合、time の値はプログラム実行時に決まります。
したがって、val は厳密には「定数」というより 読み取り専用の変数です。
valの重要な特徴
val は 参照を固定するだけであり、オブジェクトの中身まで不変にするわけではありません。
例えば次の例です。
val list = mutableListOf(1, 2, 3)
list.add(4)
このコードは問題なく実行できます。
理由は次の通りです。
listという変数自体は再代入できない- しかし
MutableListの内容は変更可能
つまり val は オブジェクトの参照を固定する仕組みです。
const val(コンパイル時定数)
Kotlinで「本当の意味での定数」と言われるのが const val です。
const val は コンパイル時に値が確定する定数です。
const val MAX_USER = 100
この値はプログラム実行時ではなく、コンパイル時点で確定します。
そのため、以下のような用途で使用できます。
- アノテーションの引数
- 定数定義
- 設定値
const valの特徴
const val にはいくつか制約があります。
主な特徴は次の通りです。
コンパイル時に値が決まる
const val VERSION = "1.0"
このように、値はコンパイル時に確定します。
使用できる型が限定される
const val で使用できる型は以下のような 基本型とStringです。
- String
- Int
- Long
- Short
- Byte
- Double
- Float
- Char
- Boolean
コレクションやオブジェクトは使用できません。
例
const val name = "Kotlin" // OK
const val max = 100 // OK
// NG
// const val list = listOf(1,2,3)
使用できる場所が決まっている
const val は次の場所でのみ定義できます。
- トップレベル
object内companion object内
const valの定義場所
トップレベル定数
Kotlinではファイルのトップレベルに定数を置くことができます。
const val API_URL = "https://example.com"
これはシンプルな定数定義としてよく使われます。
objectにまとめる方法
関連する定数をまとめたい場合は object を使います。
object Config {
const val TIMEOUT = 30
const val RETRY_COUNT = 3
}
使用例
Config.TIMEOUT
companion object
特定のクラスに属する定数として定義する場合は companion object を使用します。
class User {
companion object {
const val DEFAULT_NAME = "Guest"
}
}
使用例
User.DEFAULT_NAME
val と const val の違い
| 項目 | val | const val |
|---|---|---|
| 再代入 | 不可 | 不可 |
| 値の決定 | 実行時 | コンパイル時 |
| 型制限 | なし | 基本型とStringのみ |
| 定義場所 | どこでも | 制限あり |
const val が必要になるケース
const val は次のような場面で必要になります。
アノテーションの引数
Kotlinではアノテーションの引数には コンパイル時定数が必要です。
例
const val MESSAGE = "Deprecated API"
@Deprecated(MESSAGE)
fun oldFunction() {}
このような場合に const val が使用されます。
enum class(定数の集合)
関連する固定値を扱う場合は enum class を使うことも多いです。
enum class Status {
SUCCESS,
ERROR,
LOADING
}
使用例
val status = Status.SUCCESS
enum は単なる数値定数ではなく、列挙型のインスタンスとして扱われる点が特徴です。
Kotlinの定数の命名規則
Kotlinでは定数名に 大文字スネークケースが使われることが一般的です。
例
MAX_SIZE
DEFAULT_TIMEOUT
API_BASE_URL
これは文法ではなく コーディング規約としての推奨スタイルです。
実務でよくある定数管理の例
実務では次のように定数をまとめることがあります。
API設定
object ApiConfig {
const val BASE_URL = "https://api.example.com"
}
UI設定
object UiConfig {
const val ANIMATION_DURATION = 300
}
データベース定義
object DbColumn {
const val USER_ID = "user_id"
const val USER_NAME = "user_name"
}
Kotlinの定数のまとめ
Kotlinでは次のように使い分けるのが基本です。
var
変更可能な変数val
再代入できない読み取り専用の値const val
コンパイル時に決まる定数
実務で覚えておきたい使い分け
Kotlinでは次のように考えると理解しやすいです。
- 値が変更される →
var - 再代入しない →
val - 完全な定数 →
const val
以上、Kotlinの定数についてでした。
最後までお読みいただき、ありがとうございました。










