Java 扩展地图<>;,或者特别是HashMap<&燃气轮机;在存储条目之前检查它们

Java 扩展地图<>;,或者特别是HashMap<&燃气轮机;在存储条目之前检查它们,java,Java,我需要一个映射实现,它允许我在值存储在映射中之前检查它们。映射接口本身定义了许多将值放入映射的方式(方法)。 在HashMap实现中,所有这些“方法”都通过一个方法putVal(…),这是放置检查代码的最佳位置。然而,该方法被声明为“final”,所以我不能从HashMap中生成子类并重写它 我主要是用C#编写代码,这个问题在3分钟内就解决了。事实上,我现在非常震惊,因为我找不到用Java实现这一点的方法 怎么做的?我真的需要自己编写Map的完整实现,还是复制粘贴HashMap源代码并在putV

我需要一个映射实现,它允许我在值存储在映射中之前检查它们。映射接口本身定义了许多将值放入映射的方式(方法)。 在HashMap实现中,所有这些“方法”都通过一个方法putVal(…),这是放置检查代码的最佳位置。然而,该方法被声明为“final”,所以我不能从HashMap中生成子类并重写它

我主要是用C#编写代码,这个问题在3分钟内就解决了。事实上,我现在非常震惊,因为我找不到用Java实现这一点的方法


怎么做的?我真的需要自己编写Map的完整实现,还是复制粘贴HashMap源代码并在putVal之前删除final?

您可以通过自定义类实现这一点,例如

public class MySpecialHashMap{

private Map<> myActualMap;

public MySpecialHashMap() {
    myActualMap = new HashMap<>();
}

public void putItem(Object key, Object value) {
    // do your checks and add it to your map or not..
    }
}
公共类MySpecialHashMap{
私有地图myActualMap;
public MySpecialHashMap(){
myActualMap=新HashMap();
}
公共项(对象键、对象值){
//进行检查并将其添加到地图中,或者不添加。。
}
}

除此之外,您还可以使用泛型来定义类型。

我建议您使用decorator模式,而不是扩展
HashMap

public class CheckingMap<K, V> implements Map<K, V> {
    private final Map<K, V> delegate;

    public CheckingMap(Map<K, V> delegate) {
        this.delegate = delegate;
    }

    public boolean put(K key, V value) {
        // do the check
        return delegate.put(key, value);
    }

    // etc
}
公共类CheckingMap实现Map{
私人最终地图代表;
公共检查映射(映射代理){
this.delegate=委托;
}
公共布尔put(K键,V值){
//检查
返回delegate.put(键、值);
}
//等
}

如果实现所有方法似乎需要很多代码,您可以使用它通过一个处理程序截获所有调用-但在这种情况下,这是不必要的复杂。

虽然我喜欢Jiri的装饰器模式思想,但如果您希望支持实现,我不确定您使用的是什么java类,但下面的内容对我来说很好

class DerivedMap<V extends Object> extends HashMap {

    @Override
    public V put(Object key, Object value) {
        // Do yada yada
        return super.put(key, value);
    }
}
类DerivedMap扩展了HashMap{
@凌驾
公共V put(对象键、对象值){
//你知道吗
返回super.put(键、值);
}
}

为什么在将数据放入地图之前不能检查数据?你真的有不同的地方可以尝试添加无效数据吗?@TimothyTruckle我不是把数据放在“我自己”的位置,我提供的是地图收集,我不知道客户将如何使用它。那么我想你是怎么做的:地图是你的什么对象的内部数据存储。这不应该从外部改变。因此,与其将实际地图返回给客户机,不如返回地图的不可修改版本(
Collections.unmodifiableMap()
),并为客户机提供一种方法,让客户机提供存储在地图中的数据。@TimothyTruckle,客户机可以而且应该修改地图,我的映射与普通映射类似,但在放置数据时有一些限制。无法将继承更改为组合。在这种情况下,我使用的框架需要映射实现对象。这样,我仍然需要自己实现50%的工作。地图有很多可以修改的方法。所有这些方法,Put,PutAll,Replace,。entrySet()等,我不确定,但我认为entrySet()返回可修改的内部映射集合。因此,如果我不重新实现此功能,我的地图仍然可以绕过我的检查进行修改