Kotlin でオブジェクトのインスタンスを取得する

David Mbochi Njonge 2023年1月30日
  1. Kotlin でオブジェクトのインスタンスを取得するために Generics で is を使用する
  2. Kotlin でオブジェクトのインスタンスを取得するには、iswhen キーワードを使用する
  3. まとめ
Kotlin でオブジェクトのインスタンスを取得する

オブジェクトのインスタンスを取得することは、Kotlin、Java、TypeScript、JavaSript などのほとんどのプログラミング言語で遭遇する一般的な開発手法です。要素のインスタンスを見つけたい場合の例は、要素のタイプに基づいて要素を並べ替える場合です。

要素のインスタンスを見つけるとき、その要素が照合対象の要素と同じタイプである場合、結果は true です。それ以外の場合は、false を返します。

このチュートリアルでは、Kotlin を使用して実行時にオブジェクトのインスタンスを取得する方法を学習します。

Kotlin でオブジェクトのインスタンスを取得するために Generics で is を使用する

Generic は、コードを設計するために使用される開発アプローチであるため、任意のタイプを使用して再利用できます。

IntelliJ にアクセスし、File > New Project を選択して、新しい Kotlin プロジェクトを作成します。プロジェクト名は kotlinInstancOf など好きな名前を入力します。

[言語]セクションで [Kotlin]を選択し、[ビルドシステム]セクションで [Intellij]を選択します。[作成]ボタンを押してプロジェクトを作成します。

プロジェクトが作成されたら、kotlin フォルダーの下にフォルダー構造 com/instanceOf を作成します。instanceOf フォルダの下に Main.kt という名前のファイルを作成し、次のコードをコピーしてファイルに貼り付けます。

package com.instanceOf

interface Employee{
    fun work(): String;
}
class Manager(private val name: String): Employee{
    override fun work(): String {
        return "$name is preparing the project schedule";
    }

}
class Janitor(private val name: String): Employee{
    override fun work(): String {
        return "$name is cleaning the office";
    }

}
fun <T> doWork(Object: T): String {
    if (Object is Employee){
       return Object.work();
    }else{
        throw RuntimeException("$Object is not of type Employee")
    }
}

fun main() {
    println(doWork(Manager("John")));
    println(doWork(Janitor("Peter")));
    println(doWork("mary"));
}

この例では、Employee という名前のインターフェースと、Manager および Janitor という名前の 2つの具体的な実装を作成しました。

doWork() は上記で定義されたジェネリックメソッドであり、is キーワードを使用して、引数として渡されたオブジェクトが Employee と同じタイプであるかどうかを確認します。条件が true を返す場合、オブジェクトの work() メソッドを呼び出します。それ以外の場合は、RuntimeException() をスローします。

main メソッドでは、doWork() メソッドを 3 回呼び出し、ManagerJanitor、および文字列をそれぞれ引数として渡します。

メソッドの最初の 2つの呼び出しは、Employee と関係があるため、true と評価されます。ただし、文字列引数は Employee と関係がないため、最後の呼び出しは false と評価されます。

コードを実行して、出力が次のようになっていることを確認します。

Exception in thread "main" java.lang.RuntimeException: mary is not of type Employee
John is preparing the project schedule
Peter is cleaning the office

is キーワードはブール値を返すため、文字!を追加することで is キーワードの逆を返すことができます。キーワードの前。キャラクター !通常、not と発音されます。これは、論理ゲートを操作する場合に一般的です。

doWork() メソッドにコメントを付けて、次のコードに置き換えます。

fun <T> doWork(Object: T): String{
    if (Object !is Employee){
        throw RuntimeException("$Object is not of type employee");
    }
    return Object.work();
}

コードを再実行し、結果が前の例の出力と同じであることに注意してください。

John is preparing the project schedule
Peter is cleaning the office
Exception in thread "main" java.lang.RuntimeException: mary is not of type employee

Kotlin でオブジェクトのインスタンスを取得するには、iswhen キーワードを使用する

when キーワードは、switch キーワードが Java で機能するのと同じように機能します。唯一の違いは構文です。

前の例にコメントし、コメントの後に次のコードをコピーして Main.kt ファイルに貼り付けます。

fun fetchData() = listOf<Any>("book",3,true,"computer");

fun main() {
    for (data in fetchData()) {
        when(data){
            is String -> println(data)
            is Int -> println(data)
            is Boolean -> println(data)
        }
    }
}

上記の例では、listOf() ヘルパーメソッドに割り当てることにより、タイプ Any のリストを返す fetchData() メソッドを作成しました。listOf() メソッドは、String、Int、および Boolean 型を含むリストを返します。

main メソッドでは、ループを使用してリストを反復処理し、各値を when() メソッドに委任することにより、実行時に要素タイプを決定しました。when() ブロック内で、渡される値のタイプは is を使用して決定され、条件が true と評価された場合、値はコンソールに記録されます。

when() ブロック内でそのタイプを見つけずにリストに別のタイプを追加した場合、値はコンソールに記録されないことに注意してください。

コードを実行し、出力が次のようになっていることを確認します。

book
3
true
computer

まとめ

このチュートリアルでは、Kotlin プログラミング言語を利用して実行時に要素のインスタンスを取得する方法を学習しました。対象となるアプローチには、ジェネリックスで is キーワードを使用し、when キーワードで is キーワードを使用することが含まれます。

ジェネリックスを使用する場合は、reified 型を使用していることを確認する必要があることに注意してください。これは、型情報が実行時に利用可能であることを意味します。そうしないと、タイプチェックが機能しません。

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub

関連記事 - Kotlin Object