gpt4 book ai didi

java - Final boolean [] 与 Runnable 内的 Final boolean

转载 作者:行者123 更新时间:2023-11-30 02:38:13 24 4
gpt4 key购买 nike

为什么允许以下内容:

final boolean [] success = new boolean[1];
Thread httpThread = new Thread(new Runnable() {
@Override
public void run() {
HTTPConnect httpConnect = new HTTPConnect(getContext());
success[0] = false
...
if (whatever)
success[0] = true;

但是下面的不是吗?

final boolean success;
Thread httpThread = new Thread(new Runnable() {
@Override
public void run() {
HTTPConnect httpConnect = new HTTPConnect(getContext());
success = false
...
if (whatever)
success = true;

我指的是boolean success这里。起初我以为这是因为本地声明会失去作用域,而堆上的声明会在作用域结束后继续存在,但像 final ArrayList<Foo> bar = new ArrayList<>() 这样的声明似乎并非如此。无法赋值。

最佳答案

因为您实际上将 boolean 值包装在数组中,以便您可以更改数组的内容,但不会更改变量 success 本身的引用.

使用 AtomicBoolean(或一般情况下的 AtomicReference)可以获得相同的结果。

以下场景会出现匿名内部类修改变量的问题

boolean success;
Thread httpThread = new Thread(new Runnable() {
@Override
public void run() {
success = false;
....

这是不允许的,因为您正在更改成功所指的内容。如果您使用 boolean[],那么您不会更改 success 所指的内容,而是更改所指对象内包含的值,因此不会出现任何问题。

关于java - Final boolean [] 与 Runnable 内的 Final boolean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42521210/

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