2011-11-18 94 views
4

通過爲Android教程去(涉及到多線程,尺蠖和處理程序),我遇到了這個:將函數的參數聲明爲final:爲什麼以及何時需要?

public synchronized void enqueueDownload(final DownloadTask task) 

我的問題是:

  1. 何時以及爲什麼需要聲明一個參數作爲最終的功能?
  2. 它是特定於Java還是其他語言(如C/C++)中存在類似的東西?

回答

10

在Java中,這是通常是,以便您可以訪問匿名內部類中的參數 - 這通常用於Android中的事件處理程序等。

真正意味着是該參數的值不能在方法中改變,但目的通常是匿名內部類...

public synchronized void enqueueDownload(final DownloadTask task) { 
    SomethingHandler handler = new SomethingHandler() { 
     @Override public void handleSomething() { 
      // This would not compile if task were not final 
      task.doSomething(); 
     } 
    }; 
    // Use handler 
} 
+2

+1不錯的答案。 –

1

你聲明的東西作爲最終,如果你知道,它應該永遠不會被重新分配。您通常希望對方法參數執行此操作,因爲重新分配方法參數很有意義。

void foo(String str) { // no final 
    str = "hijacked"; // perfectly fine 
} 

void foo(final String str) { // final 
    str = "hijacked"; // compile error 
} 

C和C++使用const代替final,但我不能聲稱知道具體副手。

+1

*「因爲它很少有意義」* < - 您應該編輯,因爲我認爲你沒有寫出你的意思寫什麼; ) – TacticalCoder

1

final關鍵字在幾個不同的使用上下文作爲修飾詞,意味着它所修飾的內容在某種意義上不能改變。

final類

你會發現,一些在Java庫中的類都聲明爲final,例如

public final class字符串 這意味着這個類不會被子類化,並通知編譯器它可以執行某些優化,否則它不能。它還在安全性和線程安全性方面提供了一些好處。

編譯器不會讓你繼承任何聲明爲final的類。儘管如此,你可能不想或不需要聲明自己的類。

最終方法

您還可以聲明方法是最終的。一個聲明爲final的方法不能在子類中重寫。語法很簡單,只要把關鍵字最終的訪問說明符後的返回類型像這樣前:

public final String convertCurrency() 

最終場

您也可以聲明字段爲final。這與聲明方法或類是最終的不同。當一個字段被聲明爲final時,它是一個常數,不會也不能改變。它可以設置一次(例如,當對象被構建時,但之後無法更改。)試圖改變它會產生一個編譯時錯誤或一個異常(取決於嘗試是如何偷偷摸摸)。

既是final,static又是public的字段被有效地命名爲常量。例如,一個物理的程序可能會定義Physics.c,光的速度

public class Physics { 

    public static final double c = 2.998E8; 


} 

在SlowCar類中,speedLimit領域很可能是雙方最終和靜態的,雖然它是私有的。

public class SlowCar extends Car { 

    private final static double speedLimit = 112.65408; // kph == 70 mph 

    public SlowCar(String licensePlate, double speed, double maxSpeed, 
    String make, String model, int year, int numberOfPassengers, int numDoors) { 
    super(licensePlate, 
    (speed < speedLimit) ? speed : speedLimit, 
    maxSpeed, make, model, year, numberOfPassengers, numDoors); 
    } 

    public void accelerate(double deltaV) { 

    double speed = this.speed + deltaV; 

    if (speed > this.maxSpeed) { 
     speed = this.maxSpeed; 
    } 

    if (speed > speedLimit) { 
     speed = speedLimit; 
    } 

    if (speed < 0.0) { 
     speed = 0.0; 
    } 

    this.speed = speed;  

    } 

} 

最終參數

最後,你可以聲明方法的參數是最終的。這意味着該方法不會直接改變它們。由於所有參數都是按值傳遞的,所以這不是絕對必需的,但偶爾會有幫助。

+1

如果您打算直接從另一個網頁(本例中爲http://www.cafeaulait.org/course/week4/42.html)引用,則顯示您的來源很有禮貌。 –

2

在您的上下文中,該參數的最後一個關鍵字表示該變量任務不能在方法體內重新分配,並且出於安全原因被指定。

可以在C可以達到類似的行爲++以恆定的功能參數:

如果你正在寫一個函數,你不打算修改 參數,你可以聲明,這是一個恆定的參考參數。

相關問題