【KotlinとJava】遅延プロパティ

KotlinとJava

プロパティの遅延評価なんてものもKotlinは言語の機能として持っている。コンピュータは電力を消費してプログラムを実行する。実行しなくともよいのであれば、実行しないに越したことはないのだ。

Lazy property.kt

class LazySample {
    val lazy: String by lazy {
        println("computed!")
        "my lazy"
    }
}

fun main(args: Array<String>) {
    val sample = LazySample()
    println("lazy = ${sample.lazy}")
    println("lazy = ${sample.lazy}")
}

リンク

解説の前に動きを確認してみよう。1度目とも2度目も、lazyの内容を出力するのに変わりないが、1度目のみ「computed!」の出力とlazyへの代入が実行される。

上記のサンプルだと「computed!」と表示するだけなので、あまりありがたみを感じないかもしれないが、表示の代わりに、たとえばリストの中身を合計するなどの処理をするとしたらどうだろうか?2度目は合計は計算済みなので、結果だけ返却することになる。もっというのなら、リストの合計をしない場合だって考えられる。使われない合計を計算するのは電機を無駄にするだけだ。

Javaで記述

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

public class LazySample {  
    private String lazyValue;  
  
    public synchronized String getLazyValue() {  
        if (lazyValue == null) {  
            System.out.println("computed!");  
            lazyValue = "my lazyValue";  
        }  
        return lazyValue;  
    }  
}

public class Exp18 {  
    public static void main(String[] args) {  
        final LazySample sample = new LazySample();  
        System.out.println("lazyValue = " + sample.getLazyValue());  
        System.out.println("lazyValue = " + sample.getLazyValue());  
    }  
}

このテクニックはどんな言語でも利用できる。しかし、言語が仕組みを持っているのは頼もしく感じる。

コメント

このブログの人気の投稿

【KotlinとJava】分解宣言

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