【发布时间】:2017-03-10 18:21:50
【问题描述】:
我想扩展HashMap 以添加方法putIfGreaterThan,它基本上检索给定键的值,如果新值大于旧值,我们用新值更新旧值。像这样:
public void putIfGreaterThan(String key, Double value )
{
if (containsKey(key ) != true) {
put( key , value );
} else {
if (get(key ) < value) {
System. out .println("Adding new value: " + value + " to map" );
put( key , value );
} else {
System. out .println("Did not add value: " + value + " to map" );
}
}
}
上面的程序运行良好 - 但是我想将此方法添加到 HashMap 和 LinkedHashMap。换句话说,如果有人实例化:
HashMap hashmap = new HashMap();
他们应该能够访问该方法:
hashmap.putIfGreaterThan();
如果有人实例化:
LinkedHashMap linkedhashmap = new LinkedHashMap();
他们应该能够访问该方法:
linkedhashmap .putIfGreaterThan();
如果我创建一个新类如下:
MyHashMap extends HashMap<String, Double> 并添加前面提到的方法 - 我只是扩展 HashMap 而不是 LinkedHashMap。如果我实例化 LinkedHashMap,这将不允许我访问该方法。
我正在考虑修改原始 HashMap 类中的源代码(通过添加方法 putIfGreaterThan)但是我无法修改源代码,除非我反编译整个类(当我尝试这样做时,我得到一堆其他错误,所以我认为扩展HashMap 类会更容易,但这样做意味着我不能在HashMap 和LinkedHashMap 上使用putIfGreaterThan 方法。
此外,如果我将该方法添加到原始类中,则可以在任何 HashMap 上调用此方法(即使映射包含两个字符串),但该方法仅适用于包含字符串的 HashMap 和Double 或 String 和 Int。因此,我认为扩展原始类并使用与 String 和 Double 的 HashMap 相关的方法自定义当前类更有意义。
有什么建议吗?
谢谢
【问题讨论】:
-
我建议使用合成。让你的类有一个 hashmap,然后用你的逻辑包装 map 的 put 方法。
-
不能修改 HashMap 类本身的行为,而不仅仅是您自己的自定义类,这是有充分理由的:它会给所有地方的 Java 应用程序带来安全噩梦。
-
为什么是多余的
if (containsKey(key ) != true)而不是简单的if (! containsKey(key))? -
不要修改核心 API。您知道 Java 禁止实现(类)的多重继承,而只允许接口的多重继承,对吧?
标签: java inheritance interface hashmap