今、androidのアプリ作ってるのですがAPIをコールする部分の処理を作っています。
ApiMangaerというクラスを作って、APIのレスポンス取得後のコールバックメソッドをsuccessCallbackとfailedCallbackをインターフェースで定義して使う側に実装させるようにと考えています。
successCallbackは必須でfailedCallabckは任意で定義されていたら実行してされていなかったら何もしないという処理にしたいのですが、このような実装は可能なのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
ベストアンサー
どのような設計なのかによってよい実装例は変わってくると思いますが、ぱっと思いついたものを二つほど挙げておきます
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:25
総合スコア132
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/18 17:28 編集