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")
}
Javaの場合は、
@Override
public int setup(String str, ImagePlus imp) {
return 0;
となる(Eclipseにつくってもらいました)。a0, a1などは、おなじみにのstr, impに変更した。二つのコードを比較するとなんとなく「ははーん」とみえてくる(気がしてくる)。
overrideはJavaにもあった、@Overrideアノテーションみたいなものだが、Kotlinの場合はもっと実際的。kotlinの場合、スーパークラスやインターフェースのメソッドを書き換える場合は、必ずoverrideをつけないといけない。さらに言うと、overrideできるメソッドは、スーパークラスではopenという修飾子をつけて、明示的にoverride可能であることを示さないといけない。
- メソッドには
funキーワードが必要。
- 引数の書き方は最近の言語っぽい気がする。
str: String?でString型のオブジェクトとしてstrを宣言している。”?”については後で説明する
- 宣言の終わりに
: 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メソッドの実装を行う。