2017-08-12 40 views
1

我使用下面的代碼:爲什麼我需要將變量轉換爲@Override [inner class]方法中的最終數組?

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); 

     } 
    }; 

... 
} 

回答

3

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變量本身的值的情況下提供。

+0

如果我想更改內部匿名類中的變量並將其返回,該怎麼辦?使用改進API來消耗REST API時,我通常會遇到這個問題。 –

+2

@KavachChandra:你不能那樣做。 Java語言規則明確地阻止您在匿名內部類中使用非最終變量。我已經向您展示了兩種解決方法,第三種方法是不使用匿名內部類 - 創建* named *類並在其中聲明一個字段。 –

+0

有的博客說,那是由於編譯器本身?真的嗎? –

相關問題