最终布尔人[]与最终布尔值



为什么允许以下:

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所指的内容,而是在引用的对象中包含的值,因此没有问题。

首先,您的第二个示例有几个错别字:由于successboolean,因此不应订阅分配语句。

我假设在这两种情况下,success都是局部变量。如果是字段,则可以简单地消除final,第二种情况将起作用(消除下标后)。

第二种方法无法适用于本地变量的原因是,分配后您无法分配给final变量。这个数组的故事有些不同:您仍然无法将新数组分配给success,但是您可以为数组的元素分配新值。这就是为什么第一种方法起作用的原因。使用这样的数组是处理此问题的常见习语,也是Java方法没有" OUT"参数的问题。

最新更新