2012-10-01 133 views
1

在下面的代碼中,第一個if聲明抱怨current_guy不能是final,但第二個if聲明抱怨說current_guy不是最終的。我沒有想法。我需要設置一個變量,但我也需要它是最終的。

final int current_guy=0; 

if (a.equals("bf")){ 
    current_guy=1; 
} 

guy1.setOnClickListener(new OnClickListener() {  
    public void onClick(View v) { 

    if (current_guy==1) { 
     // TODO Auto-generated method stub 
    } 
} 
+0

備份。爲什麼這些變量需要是最終的? – Makoto

+2

它必須是最終的,因爲它是Java中的事件監聽器。 –

+0

@Makoto:對於變量可以從嵌套類訪問,它需要是最終的。 Java規則... –

回答

1

的原因,第一個抱怨是因爲你不能設置最終變量。它抱怨這不是最終的原因是你正在創建所謂的匿名內部類。因此,您的OnClickListener是一個完全獨立的類,不能在運行時從主類訪問變量。這就是爲什麼它必須是Final。然後,當編譯器構建應用程序時,它知道該值是什麼,並可以在那裏替代它。如果你想讓這個變量變得很好,那麼你必須將這個值傳遞給OnClickListener,這樣它才能在變量發生變化時獲取更新。

+0

嗯...使用你的解釋,我能夠將它移動到我的'onCreate'之外,現在它完美地工作。我以爲我已經嘗試過了,但我猜不是。只是移動'onCreate'之外的任何缺點? – EGHDK

+0

你把它移到哪裏?另一種方法的內部? – CaseyB

+0

它在'onCreate'裏面,所以我把它移到了那裏。現在它是一個全局變量。 – EGHDK

0

讓實現您的OnClickListener另一個類,並通過它current_guy作爲參數。這會阻止它抱怨變量不是最終的。聲明類內部類和方法時,不能引用非最終變量。

-2

一旦你檢查/調整,分配current_guy到最後一個變量:

int current_guy=0; 


if (a.equals("bf")) 
    { 
     current_guy=1; 
    } 

final int final_current_guy = current_guy; 

guy1.setOnClickListener(new OnClickListener() { 

    public void onClick(View v) { 

    // TODO Auto-generated method stub 
    if (final_current_guy==1) { 
     } 
    } 

或者使用一個行內賦值:

final int current_guy = (a.equals("bf") ? 1 : 0); 
8
final int current_guy = a.equals("bf") ? 1 : 0; 
+0

如果我想將其設置爲多個數字,我將如何使用它?像1,2,3,4? – EGHDK

+0

@EGHDK最終變量**不能被設置爲倍數。使用前必須設置*一次*。這是它的工作原理 - 或者它不會是最終的:) – 2012-10-01 19:20:27

+0

我可以這樣做嗎? 'final int current_guy = a.equals(「bf」)? 4:3:2:1:0' – EGHDK

3

約旦丹尼森在一個被刪除的答案有這個..不知道爲什麼,因爲它是正確的。這就是當前答案的「完整性」,只是重新發布。 (話雖這麼說,我可能會在這裏使用三元運算方法。)

注意,一個final變量的賦值可以延遲只要它是在使用之前,所有的代碼路徑分配恰好一次

final int current_guy; // no assignment here 

if (a.equals("bf")) 
    { 
     current_guy=1; 
    } 
else 
    { 
     current_guy=0; 
    } 
2

您可以指定current_guy到另一個決賽可變

final int finalCurrentGuy = current_guy; 
guy1.setOnClickListener(new OnClickListener() { 

    public void onClick(View v) { 
     if (finalCurrentGuy==1) { 
     .... 
     } 
    } 

這使得在該點的變量current_guy的副本時間並傳遞到內部類

ThisSO後解釋了爲什麼它必須是最終的內心裏面

2

我會做的是:

int current_guy=0; 

// Set the value that you want based on a condition 
if (a.equals("bf")) 
{ 
    current_guy=1; 
} 

final int valueToTest = current_guy; 
guy1.setOnClickListener(new OnClickListener() { 

public void onClick(View v) { 

if (valueToTest ==1) { 
    // your code 
    } 
} 

原因是,這是因爲onClick()方法可能會稍後執行以響應事件並且可能位於單獨的線程中。那麼你不會希望變量的值在處理程序內部或處理程序正在執行的某個地方被更改。你可以說這是爲了防止對這個值的髒讀。

相關問題