【KotlinとJava】分解宣言
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
で我慢してほしい。
コメント
コメントを投稿