通過爲Android教程去(涉及到多線程,尺蠖和處理程序),我遇到了這個:將函數的參數聲明爲final:爲什麼以及何時需要?
public synchronized void enqueueDownload(final DownloadTask task)
我的問題是:
- 何時以及爲什麼需要聲明一個參數作爲最終的功能?
- 它是特定於Java還是其他語言(如C/C++)中存在類似的東西?
通過爲Android教程去(涉及到多線程,尺蠖和處理程序),我遇到了這個:將函數的參數聲明爲final:爲什麼以及何時需要?
public synchronized void enqueueDownload(final DownloadTask task)
我的問題是:
在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
}
你聲明的東西作爲最終,如果你知道,它應該永遠不會被重新分配。您通常希望對方法參數執行此操作,因爲重新分配方法參數很有意義。
void foo(String str) { // no final
str = "hijacked"; // perfectly fine
}
void foo(final String str) { // final
str = "hijacked"; // compile error
}
C和C++使用const
代替final
,但我不能聲稱知道具體副手。
*「因爲它很少有意義」* < - 您應該編輯,因爲我認爲你沒有寫出你的意思寫什麼; ) – TacticalCoder
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;
}
}
最終參數
最後,你可以聲明方法的參數是最終的。這意味着該方法不會直接改變它們。由於所有參數都是按值傳遞的,所以這不是絕對必需的,但偶爾會有幫助。
如果您打算直接從另一個網頁(本例中爲http://www.cafeaulait.org/course/week4/42.html)引用,則顯示您的來源很有禮貌。 –
在您的上下文中,該參數的最後一個關鍵字表示該變量任務不能在方法體內重新分配,並且出於安全原因被指定。
可以在C可以達到類似的行爲++以恆定的功能參數:
如果你正在寫一個函數,你不打算修改 參數,你可以聲明,這是一個恆定的參考參數。
+1不錯的答案。 –