Java 在匿名內部函數中為外部函數變量賦值的解決方案


 Java匿名內部函數本人不怎么主動使用,但是經常會調用一些API,其中會調用一些接口,而這些接口是需要使用匿名內部類來實現的,於是就遇到了一些問題。

    就比如okHttp3 的接口調用

 OkHttpClient okHttpClient = new OkHttpClient();

            final Request okRequest = new Request.Builder()

                    .url(url)

                    .build();

            Call call = okHttpClient.newCall(okRequest);

            call.enqueue(new Callback() {

                @Override

                public void onFailure(Call call, IOException e) {

                    

                }

 

                @Override

                public void onResponse(Call call, Response response) throws IOException {});

  

 就要使用匿名內部類。

    這一用不要緊,一個問題卻難到了我,由於需要寫一個微信登陸的Controller,需要從微信端獲取用戶的js_code再由服務器向微信服務器發送data以換取用戶的openId以及sessionKey,於是就想到了okhttp3。

    由於內部類的機制,內部類在使用外部類的成員變量時,該變量必須是final修飾的,至於理由,我覺得這個博客寫的很生動:點擊打開鏈接。因此,如果想在內部類直接為外部類變量賦值的話是不可行的。那么我如何在外部類得到我在匿名內部類中獲取取的openId呢?

【解決方案】

public Map<String,Object> loginWithWechat(HttpServletRequest request){
        
        String loginUrl = "https://api.weixin.qq.com/sns/jscode2session?appid="+APP_ID
                +"&secret=" + SECRET + "&js_code=" + jsCode + "&grant_type=authorization_code";
        OkHttpClient okHttpClient = new OkHttpClient();        
        final Request okRequest = new Request.Builder()
                .url(loginUrl)
                .build();
        Call call = okHttpClient.newCall(okRequest);
        final Map<String, Object> resultMap = new HashMap<>();
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
 
            }
 
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String jsonRes = response.body().string();
                resultMap.put("json",jsonRes);
            }
        });
        String jsonStr = resultMap.get("json");
    }

【個人總結】

    不只是Map,對象也可以通過get() set()方法獲取匿名內部函數的變量。原來,雖然final不能改變變量地址,但是可以改變對象的成員變量,看來還是對Java final的修飾不熟悉啊。

 

https://blog.csdn.net/qq_37292960/article/details/81036793


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM