簡體   English   中英

為什么即使在匿名函數中更改了聲明為final的對象的狀態,似乎也要重置?

[英]Why does the state of an object declared as final seem to be reset even when it's altered inside an anonymous function?

我使用“令牌”(聲明為final的ValueContainer類的實例)來保存從JSON請求接收的數據。 在匿名函數Response.Listener()中,我設置了令牌的值,並且它可以工作。

Log.d("myTag", "token value1:" + token.getValue());

該行顯示正確的值(非null)。 但是,當我再次檢查token.getValue()的值時(這次在匿名函數之外)

Log.d("myTag", "token value2:" + token.getValue());

我得到token.getValue()= null。 我不明白為什么令牌的值似乎重置為null。 我想念什么嗎?

完整代碼:

public class MainActivity extends AppCompatActivity {

class ValueContainer<T> {
    private T value;

    public ValueContainer() { }

    public ValueContainer(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final ValueContainer<String> token = new ValueContainer<String>();
    String getTokenUrl = "http://www.someurl.com/?somekey=somevalue";

    JsonObjectRequest getTokenRequest = new JsonObjectRequest(
            Request.Method.GET, getTokenUrl, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            try {
                token.setValue(response.getString("token"));
                Log.d("myTag", "token value1:" + token.getValue());

                mainTextView.append("Response: JsonObjectRequest successful: get_token: " + token.getValue() + "\n");
            } catch (JSONException e) {
                mainTextView.append("Response: JSONException: getString():" + e);
            }
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            mainTextView.append("Response: JsonObjectRequest failed: " + error + "\n");
        }
    });
    Log.d("myTag", "token value2:" + token.getValue());
}

您可以更改“最終”對象的“實際內容”,但不能更改其地址,如示例所示。

 String stringTest = "test String";

 StringBuffer normalTest = new StringBuffer(stringTest);
 normalTest = normalTest.append(" end");
 normalTest.delete(0, 5);
 System.out.println(normalTest);

 final StringBuffer finalTest = new StringBuffer(stringTest);
// finalTest = finalTest.append(" end"); // can't work;
 finalTest.delete(0, 5);
 System.out.println(finalTest);

您可以通過您的代碼進行測試

//token =  new Token("...")// can't work
token.changeTheToken("...")// work ok

暫無
暫無

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

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