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に変更した。二つのコードを比較するとなんとなく「ははーん」とみえてくる(気がしてくる)。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メソッドの実装を行う。
0 件のコメント:
コメントを投稿