1. ホーム
  2. java

[解決済み] 汎用インターフェース【終了

2022-03-17 12:17:31

質問

例えば、リモート・サービスの呼び出しを表すインタフェースを定義したいとします。リモートサービスの呼び出しは一般に何かを返しますが、入力パラメータを含むこともあります。実装クラスは通常1つのサービスメソッドのみを実装するとします。上記の情報を考えると、以下のような設計は良くないのでしょうか(どうもしっくりこない)。

public interface IExecutesService<A,B>
{
    public A executeService();
    public A executeService(B inputParameter);
}

さて、このインターフェイスを、入力パラメータを持つリモートサービスを実行するクラスで実装するとします。

public class ServiceA implements IExecutesService<String,String>
{
  public String executeService()
  {
    //This service call should not be executed by this class
    throw new IllegalStateException("This method should not be called for this class...blabla");
  }

  public String executeService(String inputParameter)
  {
    //execute some service
  }

上記について、2点ほど質問があります。

  1. 汎用インターフェース( IExecutesService<A,B> ) インターフェイスメソッドに対して異なる入力パラメータと戻り値の型を要求するサブクラスを提供したい場合、良いですか?
  2. 上記のことをより良く行うにはどうしたらよいでしょうか?例えば、私は自分のサービスエグゼキュータを共通のインターフェース( IExecutesService しかし、実装クラスは通常どちらかのメソッドしか実装せず、IllegalStateExceptionの使用はとても醜いと感じます。また、B型パラメータは IExecutesService<A,B> は、入力パラメータなしでサービスを呼び出す実装クラスにとっては冗長になります。また、2つの異なるサービス呼び出しのために2つの別々のインターフェイスを作成するのはやりすぎだと思います。

解決方法は?

ここで一つ提案です。

public interface Service<T,U> {
    T executeService(U... args);
}

public class MyService implements Service<String, Integer> {
    @Override
    public String executeService(Integer... args) {
        // do stuff
        return null;
    }
}

型消去のため、どのクラスもこれらのうちの1つしか実装できない。これにより、少なくとも冗長なメソッドを排除することができます。

提案されているインターフェースは無理があるものではありませんが、どんな付加価値があるのか100%ではありませんね。ただ、標準の Callable インターフェイスを使用します。これは引数をサポートしていませんが、インターフェースのその部分は最も価値がありません(イミフ)。