Translate

2017年1月26日木曜日

kotlinでplugin3

KotlinでPlugin開発-3

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

PlugInFilterを実装したPluginはsetup(String str, ImagePlus imp)run(ImageProcessor ip)を持つのだった。setupメソッドで解析すべき画像を評価し、runメソッドで解析を行う。まずはsetupメソッドから実装する。

setup

Intelli J IDEAが自動的に作ってくれたコードは以下の通り。
 override fun setup(str: String?, imp: ImagePlus?): Int {
         throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
 }
Javaの場合は、
@Override
public int setup(String str, ImagePlus imp) {
// TODO Auto-generated method stub
return 0;
となる(Eclipseにつくってもらいました)。a0, a1などは、おなじみにのstr, impに変更した。二つのコードを比較するとなんとなく「ははーん」とみえてくる(気がしてくる)。
  1. overrideはJavaにもあった、@Overrideアノテーションみたいなものだが、Kotlinの場合はもっと実際的。kotlinの場合、スーパークラスやインターフェースのメソッドを書き換える場合は、必ずoverrideをつけないといけない。さらに言うと、overrideできるメソッドは、スーパークラスではopenという修飾子をつけて、明示的にoverride可能であることを示さないといけない。
  2. メソッドにはfunキーワードが必要。
  3. 引数の書き方は最近の言語っぽい気がする。str: String?でString型のオブジェクトとしてstrを宣言している。”?”については後で説明する
  4. 宣言の終わりに: Intとしていることから、このメソッドは整数型を返すことがわかる。

Null許容型

先ほどの引数のところで、imp: ImagePlus?との後ろに”?”がついていた。これがkotlinの特徴の一つ、Null安全を実現するための仕組みである。kotlinにはnull許容型非null許容型の二つの型宣言が存在する。null許容型にはnullを格納できるのに対し、非null許容型にはnullを格納することはできない。こうやってわざわざ分けておくことで、非null型にはnullが入らないことを保証し、null許容型はnullが入る可能性があるよ、ということをプログラマに教えてくれる。
そして、null許容型にアクセスするためには、null許容型で宣言されたオブジェクトにnullが本当に入っていないか確かめないといけない。その確認を怠るような書き方をすると、ビルドの段階ではじかれる。そのため、kotlinではnullpointerexceptionが起きる可能性をビルドの段階で除外することができる。
impには現在開いている画像のオブジェクトが渡されるが、もしかしたら画像は開いていないかもしれない。そうすると、impにはnullが渡されることになる。もし画像が開かれていない状態でメソッド内でimpにアクセスするようなコードを書くと、NullPointerExceptionが発生してしまう。そのため、このようにnullが入る可能性がある場合は”?”を型の後ろにつけることでnull許容型として宣言している。
あとでsetupメソッドの中でimpを使いたいので、ここでは次のように書く。
this.imp = imp 
return DOES_ALL
こうかくと、this.impのimpの箇所と、DOES_ALLの部分が赤色で表示される。それは当然impが宣言されていないからである(javaと違い、kotlinではプロパティと呼ぶらしい)。impのところを触ると、”Unresolve reference:imp”と怒られ、左に赤い電球が現れるのでそれをクリックする。すると、”Create member propety”と聞かれるので選択すると、プロパティが自動的に作成される。
private var  imp: ImagePlus?
すると、この行全体に波線が引かれ、ImagePlus?の部分は赤枠で囲われている。カーソルを持っていくと”Property must be initialized or be abstract”と出る。kotlinでは宣言されたオブジェクトは必ず初期化されなければいけない。ここでは、
private var  imp: ImagePlus? = null
と、nullで初期化?しとく。
また、DOES_ALLでも怒られるはずだ。これはクリックすると、”? ij.plugin.filter.PlugInFilter.DOES_ALL? Alt+Enter”と言われるので、言われたままにalt+enterを押すと、
import ij.plugin.filter.PlugInFilter.DOES_ALL
が自動的に書かれる。Javaと違い、プロパティ(Javaでいうメンバ変数)も明示するひつようがある。ワイルドカード”*”を使うことは可能。
次回はrunメソッドの実装を行う。

0 件のコメント:

コメントを投稿