我对处理程序有疑问。有没有一种标准的方法可以从中得到结果? 例如,我有这样的处理程序接口(Java):
interface SomeHandler {
void handleData(Object data);
}
它的实施:
public class MyHandler implements SomeHandler {
@Override
public void handleData(Object data){
//Some actions
}
}
我有一个带有方法的外部类,它请求处理程序解析它的结果。这个类是某些API的一部分,所以我无法重写它。
public class SomeClass{
public void getResults(SomeHandler handler){
Object[] dataArray = loadData();
for(Object dataItem : dataArray){
handler.handleData(dataItem);
}
}
private Object[] loadData(){
//Some internal actions
}
}
那么,从这个处理程序收集数据的最佳方法是什么?
我有两个想法:
1)
public class MyFirstHandler implements SomeHandler {
private List<Object> result = new ArrayList<Object>();
@Override
public void handleData(Object data){
result.add(data);
}
public List<Object> getResult(){
return result;
}
}
用法示例:
SomeClass someClass = //received from some external code
MyFirstHandler handler = new MyFirstHandler();
someClass.getResults(handler);
List<Object> result = handler.getResult();
2)
public class MySecondHandler implements SomeHandler {
private List<Object> resultContainer;
public MySecondHandler(List<Object> resultContainer){
this.resultContainer= resultContainer;
}
@Override
public void handleData(Object data){
resultContainer.add(data);
}
}
用法示例:
SomeClass someClass = //received from some external code
List<Object> resultContainer = new ArrayList<Object>();
MySecondHandler handler = new MySecondHandler(resultContainer);
someClass.getResults(handler);
//results are in the resultContainer now
哪一个最好?或者也许还有其他方式?
答案 0 :(得分:1)
由于Handler仅用于数据收集而没有其他任何东西(无论如何应该),我会选择第二种方法,但稍作修改
我不使用List,而是使用更抽象的类型Collection,因为Handler不需要知道如何存储数据,它只需要一个可以存储数据的地方。现在,Handler的客户端可以决定它希望如何存储数据。这将收集数据的关注与数据实际存储的方式分开。通过这种方法,客户端可以更灵活。
因此,例如,如果它不关心重复数据,它可以使用HashSet而不是ArrayList。或者,如果需要,它可以在获得结果之前添加其他数据。它甚至可以提供Collection的自定义实现。