[英]Access interface variables defined in method
我將粘貼代碼,然后解釋我需要什么。 我對如何實現這一目標一無所知,甚至無法想到完全適合我的代碼的替代方法。
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”變量,但這似乎很俗氣。 還有其他天才的想法嗎?
謝謝 :)
您可以定義自己的接口,該接口將具有返回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();
另外,有一種解決方法,可以讓您在匿名界面中使用非最終變量。 您應該只用一些變量持有者包裝變量,例如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();
但這不應該是慣用的方式。
您可以創建一個本地類,該類包裝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();
}
創建一個類實現IExecutor
其中包含類型的字段Transform
與getter和其中規定它execute
-那么你可以通過這個類的一個對象來execute
和getTransform
之后。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.