java - 为什么我需要在 @Override[inner class] 方法中将变量转换为最终数组?

标签 java android final

我正在使用以下代码:

 public void addConditions(){
    final String arriveHourse, departHourse, arriveMinutes, departMinutes;
    TimePickerDialog.OnTimeSetListener departOnTimeSetListener = new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker timePicker, int selectedHours, int selectedMinutes) {

            departHourse = String.valueOf(selectedHours);
            departMinutes = String.valueOf(selectedMinutes);

        }
    };

...
}

为什么 IDE 要求我将 departHourse 转换为最终数组?

为什么会这样,我该如何避免?

此外,如果我将变量移到类之外,它的工作方式如下:

String arriveHourse, departHourse, arriveMinutes, departMinutes;

public void addConditions(){

    TimePickerDialog.OnTimeSetListener departOnTimeSetListener = new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker timePicker, int selectedHours, int selectedMinutes) {

            departHourse = String.valueOf(selectedHours);
            departMinutes = String.valueOf(selectedMinutes);

        }
    };

...
}

最佳答案

departHourse 是最终变量。它必须是,以便在匿名内部类中使用。这意味着您不能在匿名内部类中为其分配新值。

解决这个问题的一种方法是创建一个单元素数组:

final String[] valueHolder = new String[1];
...
Foo foo = new Foo() {
    @Override public void bar() {
        valueHolder[0] = "Set in bar";
    }
}

另一种方法是使用AtomicReference:

final AtomicReference<String> valueHolder = new AtomicReference<String>();
...
Foo foo = new Foo() {
    @Override public void bar() {
        valueHolder.set("Set in bar");
    }
}

在这两种情况下,这允许您在不更改 valueHolder 变量本身的值的情况下提供新信息。

关于java - 为什么我需要在 @Override[inner class] 方法中将变量转换为最终数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45648244/

相关文章:

java - fork /加入 : Collecting results

c# - monodroid中Task的实现

java - 我需要一个 Java 正则表达式

android - 写入 Firebase 数据库时出现 NullPointerException

android - 为什么我的Gradle无法在Unity Android Build上使用?

java - 在 Java 中发生异常时为最终变量分配默认值

java - testng:在方法之间共享实例变量时运行parallel=methods

java - 当我们第一次使用一个类时,是否总是执行静态代码?

C++ Final 或 Sealed

java - 如何从 Android 中的另一个应用程序启动 Activity