装饰者模式为一个类添加附加的职责提供了方法,但我们装饰一个对象通常只是实现了该interface的方法,却忘记了Object的equals和hashcode的方法!!
在继承父类时,推荐建议是重写toString()方法。同样,我这里也推荐下,实现装饰者模式时,也同时复写equals和hashCode方法。
遇到的问题:
今天在处理Hadoop的Text的时刻遇到了一点问题,Text是Hadoop中功能类似于JDK中String的类。
MapWritable result = new MapWritable();
Map<String, Integer> resultTmp = new HashMap<String, Integer>();
for (MapWritable hmw : results.getResults()) {
for(Writable writable:hmw.keySet()){
Text text = (Text)writable;
String key = new String(text.getBytes());
Integer total = resultTmp.get(key);
IntWritable increment = (IntWritable)hmw.get(writable);
if (total!=null){
resultTmp.put(key, total+increment.get());
}else{
resultTmp.put(key, increment.get());
}
}
}
for(String key:resultTmp.keySet()){
result.put(new Text(key), new IntWritable(resultTmp.get(key)));
}
return result;
上面得到的Key的String会多出一些空格。这是由于new String(text.getBytes())导致的。这里不需要转成为String,直接使用Text即可。
MapWritable result = new MapWritable();
Map<Text, Integer> resultTmp = new HashMap<Text, Integer>();
for (MapWritable hmw : results.getResults()) {
for(Writable writable:hmw.keySet()){
Text key = (Text)writable;
Integer total = resultTmp.get(key);
IntWritable increment = (IntWritable)hmw.get(writable);
if (total!=null){
resultTmp.put(key, total+increment.get());
}else{
resultTmp.put(key, increment.get());
}
}
}
for(Text key:resultTmp.keySet()){
result.put(key, new IntWritable(resultTmp.get(key)));
}
return result;
考虑到另一个问题,equals和hashcode是否与String一样的呢!?加入到Map后?会不会导致覆盖呢?
这也是我写本文的一个重要根源所在。
--> Hadoop的源码还是OK的。