2011-11-18 96 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可以达到类似的行为++以恒定的功能参数:

如果你正在写一个函数,你不打算修改 参数,你可以声明,这是一个恒定的参考参数。

相关问题