gpt4 book ai didi

java - 通过匿名类

转载 作者:行者123 更新时间:2023-12-02 03:27:42 24 4
gpt4 key购买 nike

这是一个关于Java的问题。我有一个名为 IMyObjectPredicate 的接口(interface),它实现了应用于输入的单个测试方法:

public interface IMyObjectPredicate {
boolean test(MyObject x);
}

我想要的是能够在对象之间传递 IMyObjectPredicate 实例,并让 test 函数将其对变量的引用更新为新对象的变量引用它正在被传递给。例如,考虑一个使用此谓词的类:

public class Tester {
MyObject o;
IMyObjectPredicate myTestFunction;
int myThreshold;

public Tester(/*stuff*/) {
/*Code here which initialises the Tester instance and 'myThreshold'*/
myTestFunction = new IMyObjectPredicate() {
@Override
public boolean test(MyObject o) {
return (o.value() > myThreshold);
}
};
}

public boolean isGood() {
return myTestFunction.test(o);
}
}

我希望能够执行 Tester 对象的深度克隆,原因我不会在这里详细介绍。但其想法是,Tester 的克隆实例应该根据其myThreshold自己值来测试谓词,而不是引用 myThreshold<第一个实例的。但是,如果我将 myTestFunction 传递给 Tester 的新实例,我猜它仍然会引用第一个实例的 myThreshold 值,而不是根据封闭类的引用动态评估 myThreshold

如何完成 IMyObjectPredicate 对象的传递,该对象的测试函数使用对其传递到的新对象的字段的引用?

编辑:一个复杂的因素是,一般来说,不可能仅从 Tester 对象中的字段重建 myTestFunctionmyTestFunction 可能会被程序的其他部分覆盖,其方式与 Tester 的其他字段不相关。如果需要的话,我可以牺牲这个功能,但我宁愿不为了优雅而牺牲这个功能。

最佳答案

Java 没有 API 来替换匿名类的封闭上下文。

我从您的简化示例中看到的最简单的解决方案是向测试函数的签名添加阈值。据我了解,无论如何,阈值都会存在。

public interface IMyObjectPredicate {
boolean test(MyObject x, int threshold);
}
<小时/>

另一种方法是使用某种工厂方法,为提供的阈值创建谓词,例如

class PredicateFactory {
IMyObjectPredicate thresholdPredicate(int threshold) {
return new IMyObjectPredicate {
//...
}
}
}

然后您可以将此工厂传递给对象,该对象将使用它自己的阈值来构造谓词的新实例

factory.thresholdPredicate(myThreshold);

关于java - 通过匿名类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38595588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com