簡體   English   中英

方法中定義的訪問接口變量

[英]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 -那么你可以通過這個類的一個對象來executegetTransform之后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM