通过为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不错的答案。 –