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メソッドの実装を行う。