Translate

2017年1月30日月曜日

kotlinでplugin4

KolinでPlugin開発-4

メソッドの中身を書く-2

run

IntelliJ IDEAが自動生成したrunメソッドは次の通り。
    override fun run(p0: ImageProcessor?) {
        throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
例によってImageProcessorの引数p0はipに変えておく。
ここでは、単純にinvert処理を行う。Javaではシンプルに、
    ip.invert();
とすればよいが、もしipがnullの場合(画像が開いていない場合)はNullPointerExceptionが発生しうる。
実際にはsetupメソッドで画像の有無を確認していることから、もし画像が開いていない場合はrunメソッドまで処理が行くことはないが
したがって、kotlinで同じようにip.invert()とすると
Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type ImageProcessor?
とIntelliJ IDEAに怒られるため、それを回避するようにコードを記述する必要がある。

if文による確認

一番わかりやすいのは、ipがnullかどうか確認することだ。これは単純に
        if(ip != null) {
            ip.invert()
        }
とすればよい。

安全呼出し

null許容型のオブジェクトのプロパティにアクセスする方法として、安全呼出し (safe calls)がある。これは、プロパティの呼出しに.ではなく、?.を使う
    ip?.invert()
もしipの中身がnullの場合、nullを返すがビルドはエラーとならない。kotlinのreferenceによると、この呼び出し方法は連鎖(chain)呼出しの際に有効であると述べられている。
null-safetySave Callsを参照
例えば、もしip1がnullだった場合、
ip1: ImageProcessor? = null
IJ.log("ip1 is " + ip1?.toString())
このコードは、ip1 is nullと返す。

!!演算子

もう一つの方法は、NullPointerExceptionが好きな人(NPE Lovers)用らしいです。null共用型のプロパティを呼び出す際に!!.を使います。
    ip!!.invert()
これはJavaの時と同じような動作をする。もしipがnulの場合、nullPointerExceptionを返す。

どれを使うべきか

状況に応じて、とするべきだろう。!!演算子は、javaと同じよう挙動を示すので、kotlinを使うメリットがあまり感じられない気がする。固いのは条件文でnullかどうかを検証する方法だが、コードが長くなる。でも確実。安全呼出しはchainで使うと有用だよと書かれているが、単発の呼出しは単にnullが来てもスルーする方法にしか思えない。このあたり理解不足か。

runメソッドの中身

こんな感じにしてみた。
    override fun run(ip: ImageProcessor?) {
        if(ip != null) {
            IJ.log("if-check")
            ip.invert()
            imp?.updateAndDraw()
        }
        IJ.wait(1000)

        IJ.log("safe call")
        ip?.invert()
        imp?.updateAndDraw()

        IJ.wait(1000)
        IJ.log("!!")
        ip!!.invert()
        imp?.updateAndDraw()
    }

0 件のコメント:

コメントを投稿