Interface内のインナークラス

ちょっと調べ物してたついでに、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より何倍もステキ。