【发布时间】:2015-09-03 09:34:59
【问题描述】:
我正在写一个方法。
这是层次结构树:
IProtocoll
|
|--ProtocolImpl1
|
|--ProtocolImpl2
|
|--ProtocolImpl3
方法本身如下所示:
public static List<IProtocol> getProtocolsByType(String type, Transaction trx) {
Iterator<IProtocol> protocols = trx.getProtocols();
List<IProtocol> protocolsList = new ArrayList<IProtocol>();
while (protocols.hasNext()) {
if (StringHeper.isEqual(protocolls.next().getProtocolType(), type) {
protocolsList.add(protocolls.next());
}
}
return protocolsList
}
以及用法示例。
List<IProtocol> list = ProtocolHelper.getrProtocolsByType("PROTOCOL1", trx)
for (IProtocol protocol : list) {
ProtocolHelper.createProtocolType1((ProtocolImpl1) protocol)
}
现在 - 从类型层次结构中可以看出 - 此方法可能返回 3 种可能性。
String type 定义应返回的协议类型。 trx.getProtocols() 将返回一个包含所有 3 种协议类型的迭代器。
有没有办法以某种方式统一此方法,使其返回这 3 种类型中的一种,而无需稍后在使用该方法时使用不必要的强制转换?
【问题讨论】:
-
如果您觉得需要将具有接口类型的对象转换为其实现,那应该敲响警钟。您的抽象可能不正确,通过更改接口,您可以完全避免强制转换。 (当然这并不总是可能的,但值得检查。)
-
只是您发布的代码的旁注:您在循环中调用了两次
protocolls.next(),因此可能会跳过元素。请注意,next()会将迭代器前移 1,因此如果您想重用该元素(例如,在 if 子句中,然后将其添加到列表中),则需要存储返回值。
标签: java collections iterator