gpt4 book ai didi

java - 为什么声明为 Final 的对象的状态似乎会被重置,即使它在匿名函数内发生了更改?

转载 作者:行者123 更新时间:2023-12-01 10:19:20 24 4
gpt4 key购买 nike

我使用“token”(声明为 Final 的 ValueContainer 类的实例)来保存从 JSON 请求接收到的数据。在匿名函数 Response.Listener() 中,我设置了 token 的值并且它起作用了。

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

该行显示正确的值(非空)。但是,当我再次检查 token.getValue() 的值时(这次在匿名函数之外)

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

我得到 token.getValue() = null。我不明白为什么 token 的值似乎被重置为空。我错过了什么吗?

完整代码:

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

关于java - 为什么声明为 Final 的对象的状态似乎会被重置,即使它在匿名函数内发生了更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35715859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com