最终布尔值 [] 与 Runnable 中的最终布尔值
final boolean [] vs final boolean inside Runnable
为什么允许以下内容:
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;
....
这是不允许的,因为您正在更改 success
所指的内容。如果您使用 boolean[]
,则不会更改 success
所指的内容,而是更改所引用对象中包含的值,因此没有问题。
首先,你的第二个例子有几个拼写错误:因为 success
是一个 boolean
,赋值语句不应该有下标。
我假设在这两种情况下,success
都是局部变量。如果它是一个字段,那么你可以简单地消除 final
并且第二种情况将起作用(在消除下标之后)。
第二种方法对局部变量不起作用的原因是您无法在分配后分配给 final
变量。数组的情况有点不同:您仍然无法将新数组分配给 success
,但您可以将新值分配给数组的元素。这就是第一种方法起作用的原因。使用像这样的数组是处理此问题和 Java 方法没有 "out" 参数的问题的常见习惯用法。
为什么允许以下内容:
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;
....
这是不允许的,因为您正在更改 success
所指的内容。如果您使用 boolean[]
,则不会更改 success
所指的内容,而是更改所引用对象中包含的值,因此没有问题。
首先,你的第二个例子有几个拼写错误:因为 success
是一个 boolean
,赋值语句不应该有下标。
我假设在这两种情况下,success
都是局部变量。如果它是一个字段,那么你可以简单地消除 final
并且第二种情况将起作用(在消除下标之后)。
第二种方法对局部变量不起作用的原因是您无法在分配后分配给 final
变量。数组的情况有点不同:您仍然无法将新数组分配给 success
,但您可以将新值分配给数组的元素。这就是第一种方法起作用的原因。使用像这样的数组是处理此问题和 Java 方法没有 "out" 参数的问题的常见习惯用法。