Kotlinの定数について

採用はこちら

Kotlinでは、プログラム内で値が変わらないものを扱うために、主に次の3つの仕組みを使います。

  • var(変更可能な変数)
  • val(再代入できない読み取り専用の値)
  • const val(コンパイル時定数)

この中で「定数」として扱われることが多いのは valconst 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 の違い

項目valconst 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の定数についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次