2017-10-13 18 views
1

Apache Stormには、型なしのマップを持つIBasicBoltインターフェイスがあります。私は、私の抽象クラスでインターフェイスタイプパラメータなしのインターフェイスの実装

public abstract class MyClass implements IBasicBolt { 
    @override 
    public void prepare(Map<String, Object> stormConf, TopologyContext context) { 
    } 
} 

を、型指定された地図を追加したい

//org.apache.storm.topology.IBasicBolt 
public interface IBasicBolt extends IComponent { 
    void prepare(Map stormConf, TopologyContext context); 
    ... 
} 

は嵐のクラスに<String, Object>を追加せずにこれを行う方法はありますか?

答えて

4

Adapter patternは、このような状況に適していますが、使用例では完全に後であるとは限りません。しかし、それは正しいことを知る価値のあるパターンであり、あなたを正しい方向に向けるかもしれません。

意図は、クライアントが期待する別のインターフェイスへのクラスのインタフェースを変換します。アダプタは、クラスが連携して、互換性のないインタフェースが原因でできなかったことを可能にします。

ので、ターゲット・インタフェースを考えるあなたがプログラムしたい1、すなわち:

public interface IMyBasicBolt {  
    void prepare(Map<String, Object> stormConf, String other);  
} 

(注:私は簡単にするためStringTopologyContextを交換した)

あなたはターゲットインターフェイスを実装するアダプタクラスを作成し、その動作(コンポジション)をIBoltBasicの実装に委譲できます。アダプタBasicBoltAdapter

public class BasicBoltAdapter implements IMyBasicBolt { 

    private IBasicBolt basicBolt; 

    public BasicBoltAdapter(IBasicBolt basicBolt) { 
     this.basicBolt = basicBolt; 
    } 

    @Override 
    public void prepare(Map<String, Object> stormConf, String other) { 
     basicBolt.prepare(stormConf, other); 
    }  

} 

使用例:

IBasicBolt basicBolt = new IBasicBolt() { 

    @Override 
    public void prepare(Map stormConf, String other) { 
     System.out.println(stormConf.toString() + " " + other); 
    } 
}; 
Map<String, Object> map = new HashMap<>(); 
map.put("MapKeyTest", new Object()); 
IMyBasicBolt myBasicBolt = new BasicBoltAdapter(basicBolt); 
myBasicBolt.prepare(map, "Test"); 

あなたのケースではインターフェースIMyBasicBolt(ターゲット・インタフェース)の必要性は厳密にありません。しかし、可能であればインターフェースにプログラムするのが一般に良いです。

関連する問題