我正在编写一个类,它将对存储在 MyObjects 列表中的参数进行耗时的计算。由于我想轻松访问 List 的许多功能,因此我决定将其编写为扩展列表类型(另一种方法是将 List 作为我的类中的字段之一,并重写我将要使用的所有方法,但看起来过于复杂)。由于计算非常复杂且耗时,而结果仅取决于存储的参数(没有时间影响,没有隐藏的依赖关系等),因此我决定缓存结果。所以我的代码看起来或多或少像这样:
public class Calculator extends ArrayList<MyObject> {
private double Result = Double.NaN;
public double getResult() {
if (Double.isNaN(Result)) {
Result = CalculateResult();
}
return Result;
}
}
这样,当第一次调用 getResult() 方法时,它会计算结果并存储它,然后在后续调用中重用。
现在,可以使用各种方法修改列表的内容,并且许多修改应该清除缓存。为了实现这一点,通常我会写这样的内容:
public void add(MyObject newvalue) {
super.add(newvalue);
Result = Double.NaN;
}
但是,它不起作用,因为“super”引用泛型ArrayList类,因此编译器会产生类型错误。
在我的水平上,一个明显的技巧是创建一个临时类,它将实现 MyObject 的 ArrayList 并使 Calculator 扩展这个临时类:
public class MyArrayList extends ArrayList<MyObject> {
}
public class Calculator extends MyArrayList {
}
但这看起来又过于复杂了。难道没有更优雅的方法来实现这个结果吗?或者,是否有一种类似于 SQL 中触发器的机制,每当对列表进行任何修改时,它都会强制我的类清除缓存?
最佳答案
方法add
应该返回 boolean 值,所以你需要做的就是
public boolean add(MyObject newvalue) {
boolean retVal = super.add(newvalue);
Result = Double.NaN;
return retVal ;
}
关于java - "Overriding"类中带有通配符的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23708308/