ちょっと調べ物してたついでに、Interfaceの中にインナークラスを書けることを見つけました。
Interfaceの中の内部クラス - ゆるよろ・オブ・ザ・( ;゚皿゚)ノシΣ フィンギィィーーッ!!! 日記
これは知らなかった。
Javaだと、戻り値を複数返すことができません。
でも、一回の呼び出しで複数の戻り値が欲しい時もあるわけです。
そんな時今までだと、
- MapとかListに入れる
- 戻り値用のValueObjectを新しく作る
等が考えられました。
最初のパターンは、ちゃんと設計してない感じがして嫌です。
厳密な型付けができないから実行時にClassCastExceptionとか出る可能性が高くなります。
(Mapを引数に使うときも Map
で、いちいち戻り値用にValueObjectを作ってたんですが、
Interfaceでのメソッドの単位で戻り値用のValueObjectなんか作ってしまうと
IDEのエクスプローラー画面で見ちゃったりするとあまりの数の多さにげんなりします。
そこで、Interface内でのインナークラスですよ。
うわー、これすっげー素敵。
Interfaceで定義した戻り値なんだからInterfaceの中になきゃおかしいのは当然な気がします。
ソースはこんな感じ。
package jp.co.nemuzuka; import jp.co.nemuzuka.bean.BeanA; import jp.co.nemuzuka.bean.BeanB; public interface MyInterface { Result execute(); class Result { private BeanA beanA; private BeanB beanB; private int status; public BeanA getBeanA() { return beanA; } public void setBeanA(BeanA beanA) { this.beanA = beanA; } public BeanB getBeanB() { return beanB; } public void setBeanB(BeanB beanB) { this.beanB = beanB; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } } }
インナークラスのResultには、
jp.co.nemuzuka.MyInterface.Result
でアクセスできます。
インナークラスに対して存在意義が見つからなかったんですが、これは良いです。
ただ、同じ構造のインナークラスができる可能性があるのか・・・それはしょうがないかな。
なんにせよ戻り値Mapより何倍もステキ。