2017-10-13 240 views
1

Apache Storm具有帶無類型Map的接口IBasicBolt實現不帶接口類型參數的接口

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

我想在我的抽象類中添加類型化的地圖,

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

有沒有辦法做到這一點不增加<String, Object>風暴類?

回答

4

Adapter pattern適用於這種類型的情況,雖然在您的用例可能不完全是你在之後。但這是一種值得了解的模式,可能會引導您朝着正確的方向前進。

意向

將一個類的接口轉換成另一個接口的客戶期望。適配器讓類可以協同工作,否則就不能因爲不可兼容的接口。

所以考慮目標接口,即一個你希望編程到:

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

(注:我已經取代TopologyContextString爲簡單起見)

你然後可以創建一個適配器類來實現您的目標接口並將行爲(組合)委託給IBoltBasic的實現。

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); 
    }  

} 

示例使用適配器BasicBoltAdapter的:

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(目標接口)。但是,如果可能的話,編程到接口通常是很好的。