我多年来一直使用 Java 1.6(维护遗留工具),现在才刚刚开始迁移到 1.8。一个很大的变化是 java.util.Collections 套件中的功能方法。我最担心的是我有几个集合扩展,它们在修改时应用了仔细的检查或算法。默认方法是否调用已定义的 put(..)、get(...)、remove(..) 等函数,或者我是否必须进行重大修改才能使其正常工作?
例如(忽略 null 检查等。只包含值 <= 10 的映射)
public class LimitedMap extends HashMap<String, Integer>{
@Override
public Integer put(String key, Integer value){
if(value> 10) throw new IllegalArgumentException();
return super.put(key, value);
}
@Override
public Integer computeIfAbsent(String key, Function<? super String, ? extends Integer> mappingFunction) {
return super.computeIfAbsent(key, mappingFunction);
}
}
有了这对函数:我是否还需要做一个详细的覆盖并将新的检查放入 computeIfAbsent 函数中?
最佳答案
您可以确定只能使用 Java 8 之前的接口(interface)方法的唯一方法是,如果您可以某种方式委托(delegate)给接口(interface) 中的默认方法实现(在本例中为 Map<K, V>
).
也就是说,如果您可以编写如下内容(您不能)。
public class LimitedMap extends HashMap<String, Integer> {
@Override
public Integer computeIfAbsent(String key,
Function<? super String, ? extends Integer> mappingFunction) {
return Map.super.computeIfAbsent(key, mappingFunction);
}
}
不幸的是,这是不合法的,因为您只能调用您覆盖的方法(这里是来自 HashMap<String, Integer>
的方法),而不是继承方法可能已覆盖的方法(这些是 super
的正常规则)方法调用)。
因此,对于您的情况,我看到的唯一解决方法是在辅助类中创建接口(interface)默认方法实现的副本,如下所示:
public class Maps {
public static <K, V> V computeIfAbsent(Map<K, V> map,
K key, Function<? super K, ? extends V> mappingFunction) {
Objects.requireNonNull(mappingFunction);
V v;
if ((v = map.get(key)) == null) {
V newValue;
if ((newValue = mappingFunction.apply(key)) != null) {
map.put(key, newValue);
return newValue;
}
}
return v;
}
}
这是来自 java.util.Map
的实现作为由附加参数增强的静态方法 map
用于实例操作。
有了这样的辅助类,您现在可以编写
public class LimitedMap extends HashMap<String, Integer> {
@Override
public Integer computeIfAbsent(String key,
Function<? super String, ? extends Integer> mappingFunction) {
return Maps.computeIfAbsent(this, key, mappingFunction);
}
}
这不是最漂亮的解决方案,但应该只需付出有限的努力即可实现。
关于java - 集合功能方法是否调用 get、put 等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44218254/