实现没有接口类型参数的接口
Implementing an interface without an interface type parameter
Apache Storm 有一个接口 IBasicBolt,带有一个未类型化的映射。
//org.apache.storm.topology.IBasicBolt
public interface IBasicBolt extends IComponent {
void prepare(Map stormConf, TopologyContext context);
...
}
我想在我的摘要中添加类型化地图 class,
public abstract class MyClass implements IBasicBolt {
@override
public void prepare(Map<String, Object> stormConf, TopologyContext context) {
}
}
有没有什么办法不把<String, Object>
加入风暴class?
Adapter pattern 适用于这种情况,尽管在您的用例中可能不完全是您所追求的。但这是一个值得了解的模式,可能会引导您朝着正确的方向前进。
意图
将class的接口转换为客户期望的另一个接口。适配器让 class 由于接口不兼容而无法协同工作。
例子
因此请考虑目标接口,即您希望编程到的接口:
public interface IMyBasicBolt {
void prepare(Map<String, Object> stormConf, String other);
}
(注意:为简单起见,我已将 TopologyContext
替换为 String
)
然后您可以创建一个适配器 class 来实现您的目标接口并将行为(组合)委托给 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
(您的目标接口)。但通常最好在可能的情况下对接口进行编程。
Apache Storm 有一个接口 IBasicBolt,带有一个未类型化的映射。
//org.apache.storm.topology.IBasicBolt
public interface IBasicBolt extends IComponent {
void prepare(Map stormConf, TopologyContext context);
...
}
我想在我的摘要中添加类型化地图 class,
public abstract class MyClass implements IBasicBolt {
@override
public void prepare(Map<String, Object> stormConf, TopologyContext context) {
}
}
有没有什么办法不把<String, Object>
加入风暴class?
Adapter pattern 适用于这种情况,尽管在您的用例中可能不完全是您所追求的。但这是一个值得了解的模式,可能会引导您朝着正确的方向前进。
意图
将class的接口转换为客户期望的另一个接口。适配器让 class 由于接口不兼容而无法协同工作。
例子
因此请考虑目标接口,即您希望编程到的接口:
public interface IMyBasicBolt {
void prepare(Map<String, Object> stormConf, String other);
}
(注意:为简单起见,我已将 TopologyContext
替换为 String
)
然后您可以创建一个适配器 class 来实现您的目标接口并将行为(组合)委托给 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
(您的目标接口)。但通常最好在可能的情况下对接口进行编程。