繁体   English   中英

在没有接口类型参数的情况下实现接口

[英]Implementing an interface without an interface type parameter

Apache Storm具有接口IBasicBolt和未类型化的Map。

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

我想在我的抽象类中添加一个类型化的Map,

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

有什么方法可以在不向Storm类添加<String, Object>情况下执行此操作?

适配器模式适用于这种情况,尽管在您的用例中可能并不完全是您想要的。 但这是一个值得了解的模式,可能会引导您朝正确的方向发展。

意图

将类的接口转换为客户端期望的另一个接口。 Adapter允许类由于接口不兼容而无法一起工作。

因此,请考虑目标接口,即您希望编程的接口:

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

(注意:为简单起见,我已将String替换为TopologyContext

然后,您可以创建一个适配器类,该适配器类实现您的目标接口,并将行为(组成)委托给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使用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接口(您的目标接口)。 但是在可能的情况下,最好对接口进行编程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM