【KotlinとJava】分解宣言

13 分解宣言

KotlinとJava

今回は変数に値を代入するサンプルなのだが、一見何を行っているのかがわからないかもしれない。Javaのサンプルと見比べて理解を進めてほしい。

非構造化宣言や分解宣言、分割代入などと呼ばれるようだ。

Destructuring declarations.kt

fun main(args: Array<String>) {  
    val pair = Pair(1, "one")  
  
    val (num, name) = pair  
  
    println("num = $num, name = $name")  
}  
  
class Pair<K, V>(val first: K, val second: V) {  
    operator fun component1(): K {  
        return first  
    }  
  
    operator fun component2(): V {  
        return second  
    }  
}

リンク

重要なポイントはval (num, name) = pairの部分である。オブジェクトが二つの変数に代入されているように見える。これは次のように解釈される。

val num = pair.component1()
val name = pair.component2()

この方法を利用することで、関数は複数の戻り値を持つことができる。上記の例では、2つの値を戻しているが、componentNの部分を増やしていけば、その分だけ戻り値が増えていく。分割宣言を行うためには、関数の頭にoperatorをつける必要がある。

これを見ていて「Mapに似ているな」と気が付いたあなたは鋭い。MapのKey-ValueにはそれぞれcomponentNが割り当てられているのだ。

operator fun <K, V> Map.Entry<K, V>.component1() = getKey()  
operator fun <K, V> Map.Entry<K, V>.component2() = getValue()

この後のサンプルで出てくるので、お楽しみに。

Javaで記述

対比ができるようにJavaでも同じものを記述してみよう。

public class Exp13 {  
    public static void main(String[] args) {  
        final Pair<Integer, String> pair = new Pair<>(1, "one");  
        final int num = pair.getFirst();  
        final String name = pair.getSecond();  
  
        String template = "num = %d, name = %s";  
        System.out.println(String.format(template, num, name));  
    }  
}
  
public class Pair<K, V> {  
    private final K first;  
    private final V second;  
  
    public Pair(K first, V second) {  
        this.first = first;  
        this.second = second;  
    }  
  
    public K getFirst() {  
        return first;  
    }  
  
    public V getSecond() {  
        return second;  
    }  
}

Javaではもはや同じ記述ができない。通常のgetterで我慢してほしい。

コメント

このブログの人気の投稿

wxPythonでのモーダルダイアログ作成