Kotlinでの定数の宣言!初心者向けの方法12選

Kotlinでの定数宣言のイラストとサンプルコードのスクリーンショット Kotlin

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

このサービスはSSPによる協力の下、運営されています。

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Kotlinは現代のアプリケーション開発において非常に人気のあるプログラミング言語となっています。

特に、Androidアプリ開発では公式言語として採用されているため、多くの開発者がKotlinを学び始めています。

そんな中、プログラミングの基本ともいえる「定数」の宣言方法について、具体的にどのように行うのか疑問を持っている方も多いのではないでしょうか。

この記事を読めば、Kotlinでの定数宣言の方法を12通り身につけることができます。

また、具体的なサンプルコードとその解説を交えながら、初心者の方でもスムーズに学び進めることができる内容となっております。

ぜひ最後までお付き合いください。

●Kotlinとは

KotlinはJetBrainsによって開発された、モダンで静的型付けのプログラミング言語です。

Javaとの互換性が高いため、Javaのコードベースを持つプロジェクトでも容易に導入・移行することが可能です。

○Kotlinの特徴

Kotlinは、次のような特徴を持っています。

  1. Null安全:Kotlinでは、nullを持つことができる変数とそうでない変数を明確に区別できるため、NullPointerExceptionのリスクを大きく減少させることができます。
  2. 拡張関数:既存のクラスに新しい関数を追加することなく、新しい関数のように呼び出すことができます。
  3. ラムダ式と高階関数:簡潔にコードを書くことができ、読みやすいコードを実現します。

○Kotlinが選ばれる理由

Kotlinが多くの開発者に支持される理由としては、次のような点が挙げられます。

  1. 簡潔性:Kotlinの文法はシンプルであり、冗長なコードを大幅に削減できるため、コードの読みやすさや保守性が向上します。
  2. 互換性:既存のJavaコードとの互換性が高いため、JavaプロジェクトにKotlinを導入しやすいです。
  3. 安全性:Null安全やスマートキャストなどの機能により、バグを予防することができます。

●Kotlinでの定数の基本的な宣言方法

定数とは、プログラミングにおいて、その値が変わらない変数のことを指します。

変数がプログラムの実行中に値が変更されることがあるのに対し、定数は一度設定されるとその後変更することができません。

○定数とは

Kotlinにおいて、定数は「val」キーワードを使って宣言します。しかし、これだけでは完全な定数とは言えません。

「val」は再代入が不可能な変数を指すため、実行時にその値が決まる場合もあります。

完全な定数、つまりコンパイル時にその値が確定するものを宣言する場合は、「const val」という形式を使用します。

○Kotlinでの定数の特徴

Kotlinの定数には次のような特徴があります。

  1. 再代入不可能:一度定数として値が設定されると、それ以降は値の変更ができません。
  2. コンパイル時定数:「const val」を使用して宣言された定数は、コンパイル時にその値が確定します。
  3. トップレベルやオブジェクト内部、companion object内でしか「const val」は使用できません。
  4. プリミティブ型やString型のみ「const val」で宣言できます。

●Kotlinでの定数の宣言の使い方

Kotlinでの定数宣言は、非常に直感的で初心者でも容易に学ぶことができます。

それでは、具体的なサンプルコードをもとに、宣言方法を一つ一つ見ていきましょう。

○サンプルコード1:基本的な定数の宣言

最初に、基本的な定数の宣言方法から見ていきます。

下記のコードは、「val」キーワードを使用して定数を宣言しています。

このコードでは変数「greeting」を定数として、文字列「こんにちは」を割り当てています。

val greeting = "こんにちは"
println(greeting)

このコードでは「val」を使って「greeting」という名前の定数を宣言し、文字列「こんにちは」を割り当てています。

この「greeting」は再代入が不可能ですので、値を変更することはできません。

このコードを実行すると、画面に「こんにちは」と表示されます。

これは、println関数が「greeting」定数に割り当てられた文字列をコンソールに出力するためです。

○サンプルコード2:companion objectを使用した定数の宣言

次に、companion object内での定数宣言方法を見ていきましょう。

下記のコードは、クラス内のcompanion objectブロック内で定数を宣言しています。

class Greeting {
    companion object {
        const val hello = "こんにちは" // コンパイル時定数
    }
}

fun main() {
    println(Greeting.hello)
}

このコードでは、Greetingクラスのcompanion objectブロック内で「const val」を使用して「hello」という定数を宣言しています。

この「hello」定数はコンパイル時に値が割り当てられ、その後は値の変更が不可能です。

コードを実行すると、「こんにちは」と表示されます。

これは、main関数内でprintln関数を使用して、Greetingクラスのcompanion object内にある「hello」定数を出力しているためです。

○サンプルコード3:トップレベルの定数宣言

Kotlinでは、トップレベルの場所に直接定数を宣言することができます。

このトップレベルの定数宣言は、特定のクラスやオブジェクトの中に属さない定数を宣言する際に非常に便利です。

ここでは、トップレベルでの定数宣言のサンプルコードを紹介します。

const val TOP_LEVEL_CONSTANT = "トップレベルの定数です"

fun main() {
    println(TOP_LEVEL_CONSTANT)
}

このコードでは、const valを使用して「TOP_LEVEL_CONSTANT」という名前の定数を宣言し、文字列「トップレベルの定数です」を割り当てています。

トップレベルで宣言された定数は、同一のファイル内のどこからでもアクセスすることができます。

上記のコードを実行すると、画面に「トップレベルの定数です」と表示されます。

これは、main関数内でprintln関数がトップレベルに宣言された「TOP_LEVEL_CONSTANT」定数を参照しているためです。

○サンプルコード4:アノテーションを使った定数の利用

アノテーションと組み合わせて定数を使用することも可能です。

アノテーション内では直接文字列や数値を使用することができますが、定数を利用することでより柔軟なコードの記述が可能になります。

下記のサンプルコードは、アノテーションに定数を使用しています。

const val TABLE_NAME = "user_table"

@DatabaseTable(tableName = TABLE_NAME)
class User {
    // ...
}

このコードでは、「TABLE_NAME」という名前の定数を宣言し、その定数を@DatabaseTableアノテーションのtableName属性に割り当てています。

このようにして定数をアノテーションに適用することで、後から定数の値を変更した場合でも、その変更がアノテーションの属性値にも反映されるので、コードの変更やメンテナンスが容易になります。

●Kotlinでの定数の応用例

Kotlinでの定数宣言は、初歩的な利用だけでなく、多岐にわたる応用が考えられます。

今回は、いくつかの応用例として、enumの利用や拡張関数との組み合わせなどを紹介します。

○サンプルコード5:定数を用いたenumの利用

enum(列挙型)を使用する際に、特定の固定値を保持するために定数を活用することができます。

enum class WeekDays(val dayNumber: Int) {
    MONDAY(1),
    TUESDAY(2),
    // ... 省略 ...
    SUNDAY(7);
}

fun main() {
    val today = WeekDays.MONDAY
    println("今日は${today.name}、週の${today.dayNumber}日目です。")
}

このコードでは、WeekDaysというenum内で各曜日に対して週の何日目かを表す定数値を割り当てています。

そして、main関数でその定数値を利用して出力しています。

上記のコードを実行すると、「今日はMONDAY、週の1日目です。」と表示されます。

○サンプルコード6:定数と拡張関数の組み合わせ

Kotlinでは、拡張関数を利用して既存の型に新しい機能を追加することができます。

定数と組み合わせることで、より有用な機能を追加することができます。

const val TAX_RATE = 0.1

fun Double.withTax(): Double {
    return this * (1 + TAX_RATE)
}

fun main() {
    val price = 100.0
    println("税込み価格は${price.withTax()}円です。")
}

このコードでは、Double型にwithTaxという拡張関数を追加して、税込み価格を計算しています。

TAX_RATEという定数を利用して税率を管理しています。

上記のコードを実行すると、「税込み価格は110.0円です。」と表示されます。

○サンプルコード7:定数を使用したシングルトンパターン

シングルトンパターンは、特定のクラスのインスタンスが1つしか存在しないことを保証するデザインパターンの1つです。

Kotlinでは、このパターンを簡単に実装することができますが、定数を使ってより効果的にシングルトンパターンを活用する方法を紹介します。

object Singleton {
    const val CONSTANT_VALUE = "シングルトン内の定数"

    fun displayMessage() {
        println("このクラスはシングルトンとして動作します。定数の値:$CONSTANT_VALUE")
    }
}

fun main() {
    Singleton.displayMessage()
}

このコードでは、objectキーワードを使ってシングルトンクラスSingletonを定義しています。

その中にCONSTANT_VALUEという定数を宣言し、displayMessageという関数を定義しています。

main関数でこのシングルトンクラスを呼び出してメッセージを表示しています。

上記のコードを実行すると、「このクラスはシングルトンとして動作します。定数の値:シングルトン内の定数」と表示されます。

○サンプルコード8:定数を使ったアノテーションの定義

アノテーションは、メタデータをコードに追加するための強力なツールです。

ここでは、Kotlinで独自のアノテーションを定義する際に、定数を使って情報を提供する方法を紹介します。

annotation class MyAnnotation(val description: String)

const val ANNOTATION_DESC = "この関数は特別な関数です"

@MyAnnotation(ANNOTATION_DESC)
fun specialFunction() {
    println("特別な関数が実行されました")
}

fun main() {
    specialFunction()
}

このコードでは、MyAnnotationという独自のアノテーションを定義しています。

このアノテーションにはdescriptionというパラメータがあり、その値として定数ANNOTATION_DESCを割り当てています。

そして、このアノテーションをspecialFunctionという関数に適用しています。

上記のコードを実行すると、「特別な関数が実行されました」と表示されます。

ただし、この例ではアノテーションが直接的な機能を持たないため、アノテーションの値は実行時には見えませんが、リフレクションやアノテーション処理ツールを使用すると、この情報を取得・利用することができます。

●定数宣言の注意点と対処法

Kotlinでの定数宣言は非常に便利である一方で、注意すべきポイントがいくつか存在します。

ここでは、それらの注意点とそれに対する対処法を詳しく解説していきます。

○サンプルコード9:初期化が必要な定数の宣言

定数はその性質上、宣言と同時に初期化する必要があります。

しかし、場合によっては後から初期化したい場面も出てくるかと思います。

こういったケースでは定数を使用することができません。

そのため、変数を使用しvalキーワードを使って後から初期化する方法が考えられます。

class SampleClass {
    val lateInitValue: String

    init {
        lateInitValue = "後から初期化される値"
    }
}

fun main() {
    val sample = SampleClass()
    println(sample.lateInitValue)  // 出力: 後から初期化される値
}

このコードでは、lateInitValueという名前の変数を初期化せずに宣言しています。

その後、initブロック内で初期化しています。

このように、定数を使用せずに後から初期化する場合は、valを使用した変数を利用することで対応可能です。

○サンプルコード10:コンパイル時定数とランタイム定数の違い

Kotlinには、constキーワードを用いてコンパイル時定数として宣言する方法と、valキーワードのみを使用してランタイム時に初期化される定数の2つの方式が存在します。

これらの違いを理解することは、効率的なコードを書く上で重要です。

const val compileTimeConstant = "コンパイル時定数"
val runtimeConstant: String

init {
    runtimeConstant = "ランタイム定数"
}

fun main() {
    println(compileTimeConstant)  // 出力: コンパイル時定数
    println(runtimeConstant)     // 出力: ランタイム定数
}

このコードでは、compileTimeConstantという名前でコンパイル時定数を、runtimeConstantという名前でランタイム定数を宣言しています。

コンパイル時定数はプログラムがコンパイルされるときに値が確定し、ランタイム定数はプログラムの実行中に初期化されます。

この違いを把握しておくことで、どちらの定数を使用するかの判断がスムーズになります。

●カスタマイズ方法

Kotlinでの定数宣言は基本的にシンプルですが、実際の開発の現場ではその定数をカスタマイズして利用する場面が頻繁にあります。

ここでは、Kotlinでの定数のカスタマイズ方法について具体的なサンプルコードとともに詳しく解説していきます。

○サンプルコード11:定数を利用したカスタマイズ例

定数は主に設定値や固定値を管理するために使用されます。

しかし、場合によってはこれらの定数を組み合わせて新しい値を生成することも考えられます。

ここでは、2つの定数を組み合わせてURLを生成する簡単な例を紹介します。

const val BASE_URL = "https://example.com/"
const val ENDPOINT = "api/v1/items"

fun main() {
    val completeUrl = "$BASE_URL$ENDPOINT"
    println(completeUrl)  // 出力: https://example.com/api/v1/items
}

このコードでは、BASE_URLENDPOINTという2つの定数を使って、completeUrlという新しいURLを生成しています。

文字列の連結には$記号を使っています。

○サンプルコード12:定数の名前や値を動的に変更する方法

一般的に、定数はその名の通り変更することができない値を持つ変数として定義されます。

しかし、プログラムの実行中に動的に名前や値を変更したい場合もあります。

このような場合、Kotlinではproperty delegationを用いることで、動的に値を変更することができます。

var customValue: String by Delegates.observable("初期値") { _, _, newValue ->
    println("定数の値が$newValueに変更されました。")
}

fun main() {
    println(customValue)  // 出力: 初期値
    customValue = "新しい値"
    println(customValue)  // 出力: 新しい値
}

このコードでは、customValueという変数の値が変更されるたびに、指定した処理(この場合は変更を通知する処理)が実行されます。

Delegates.observableを用いることで、変数の値の変更を監視し、任意の処理を挟むことができます。

まとめ

Kotlinでの定数宣言は、プログラムの中で一貫性を持たせる上で非常に重要な要素です。

Kotlinを使用する上で、これらの知識は日々の開発作業をスムーズに進めるための土台となります。

また、初心者の方でも理解しやすいようにサンプルコードを交えながら詳しく解説してきましたので、これからKotlinでのプログラミングを始める方はもちろん、既に経験のある方も定数の扱い方に関して新しい発見や知識のブラッシュアップができたのではないでしょうか。

新しい技術や方法が次々と登場しますので、この記事をきっかけにして、さらなる学びを続けていくことをおすすめします。