Runnable中的final boolean [] vs final boolean

时间:2017-03-01 00:33:02

标签: java multithreading 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<>()之类的声明无法分配值。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

这是不允许的,因为您正在更改 success所指的内容。如果您使用boolean[],那么您不会更改引用的success内容,而是包含引用对象中包含的值,因此没有问题。

答案 1 :(得分:1)

首先,您的第二个示例有一些拼写错误:由于successboolean,因此不应下载赋值语句。

我假设在这两种情况下,success都是局部变量。如果它是一个字段,那么你可以简单地消除final,第二个案例将起作用(在删除下标之后)。

第二种方法不适用于局部变量的原因是,在分配后,您无法分配final变量。数组的故事有点不同:您仍然无法为success分配新数组,但您可以为数组元素分配新值。这就是第一种方法有效的原因。使用这样的数组是解决这个问题和Java方法没有&#34; out&#34;的问题的常用习惯用法。参数。