どのような設計なのかによってよい実装例は変わってくると思いますが、ぱっと思いついたものを二つほど挙げておきます
1つ目はコールバックインターフェースを実装しているインスタンスをnullチェックする方法です。
必須/任意かはメソッドのオーバーロードなどで調整すればうまく設定しているように見えるかと思いますが、両方を設定する場合メソッドの引数が2つ必要になりますね。。。
java
1 interface Callback{
2 void call(Object obj);
3 }
4
5 void connect(Callback successCallback,Callback failedCallback){
6 try{
7 // 通信処理とか
8
9 successCallback.call("成功!");
10 }catch(Exception e){
11 if(failedCallback != null){
12 failedCallback.call("失敗!");
13 }
14 }
15 }
2つ目はコールバックインターフェースを異なる2つに分け(コールバックメソッド名が異なるようになるように)、必須のほうをメソッドの引数、任意のほうをinstanceofで判定する方法です。
こちらは上述と比べてメソッドの引数は1つでも十分ですが、任意のコールバックインターフェースが引数の型指定にない点が少し残念ですね
java
1 interface SuccessCallback{
2 void success(Object obj);
3 }
4
5 interface FailedCallback{
6 void fail(Object obj);
7 }
8
9 void connect(SuccessCallback callback){
10 try{
11 // 通信処理とか
12
13 callback.success("成功!");
14 }catch(Exception e){
15 if(failedCallback instanceof FailedCallback){
16 ((FailedCallback)callback).fail("失敗!");
17 }
18 }
19 }
20
個人的なおすすめとしては1つ目のほうになります、2つ目のほうはインターフェースの多重継承(っていうのかな)をする必要が出てきたりするからです。
例としては、1つ目のほうは同じインターフェースを使いまわす風に書いてますが異なるインターフェースのほうが都合よく書けるだろうしジェネリクスとか使うとAPIを表現するうえでいい感じになるかと思います。
ひょっとしたら下記のようなインターフェースをお考えかもしれないですが、インターフェース内のあるメソッドだけ実装せずにインターフェースを実装することはできないので、どういう方法であれインターフェースを分けるかインスタンスを分けるかしないといけないと思います。
java
1 interface Callback{
2 void successCallback(Object obj);
3
4 void failedCallback(Object obj);
5 }
2017/01/18 17:28 編集