我只需粘贴代码然后解释我需要什么。我迷失了如何实现这一点,我甚至无法想到适合我的代码的替代方案。
public Transform findById(final int id) {
final Transform returnTransform = null;
execute(new IExecutor() {
Transform returnTransform = null;
@Override
public boolean execute(Transform transform) {
if (transform.getID() == id) {
returnTransform = transform;
return true;
}
return false;
}
});
return <returnTransform>;
}
我需要的是从界面中获取变量'returnTransform'并使用它从'findById'方法返回。
我无法在方法中定义变量,因为它必须是最终在方法中访问的:我需要更改它。
一种解决方案是直接在类中定义'returnTransform'变量,但它似乎很俗气。来自任何人的任何其他天才想法? 谢谢:))
答案 0 :(得分:3)
您可以定义自己的界面,该界面有返回returnTransform
的方法,例如:
public interface ExecutorWithTransform extends IExecutor {
public Transform getTransform();
}
然后在创建实例时应该在代码中使用此接口:
ExecutorWithTransform executor = new ExecutorWithTransform() {
Transform returnTransform = null;
public Transform getTransform() {
return returnTransform;
}
@Override
public boolean execute(Transform transform) {
if (transform.getID() == id) {
returnTransform = transform;
return true;
}
return false;
}
};
execute(executor);
return executor.getTransform();
此外,还有一个解决方法,它允许您在匿名界面中使用非最终变量。您应该使用一些变量holder来包装varible,例如AtomicReference
:
final AtomicReference<Transform> returnTransform = new AtomicReference<>();
execute(new IExecutor() {
@Override
public boolean execute(Transform transform) {
if (transform.getID() == id) {
returnTransform.set(transform);
return true;
}
return false;
}
});
return returnTransform.get();
但这不应该是惯用的方式。
答案 1 :(得分:1)
您可以创建一个本地类,它包装Transform
变量并为其公开访问器方法。然后,您可以使用final
包装器实例,并且您将被允许更改其内部状态。
例如:
public Transform findById(final int id) {
class Wrapper {
private Transform returnTransform = null;
Transform getReturnTransorm() { return returnTransform; }
void setReturnTransform(Transform returnTransform) {
this.returnTransform = returnTransform;
}
}
final Wrapper wrapper = new Wrapper();
execute(new IExecutor() {
@Override
public boolean execute(Transform transform) {
if (transform.getID() == id) {
wrapper.setReturnTransform(transform);
return true;
}
return false;
}
});
return wrapper.getReturnTransform();
}
答案 2 :(得分:0)
创建一个实现IExecutor
的类,其中包含带有getter的Transform
类型的字段,并将其设置在execute
中 - 然后您可以将此类的对象传递给{{1}之后和execute
。