将函数的参数声明为final:为什么以及何时需要它?

SpeedBirdNine:

通过针对android的教程(与多线程,循环程序和处理程序有关),我发现:

public synchronized void enqueueDownload(final DownloadTask task)

我的问题是:

  1. 什么时候以及为什么需要将函数的参数声明为final?
  2. 它特定于Java还是在其他语言(例如C / C ++)中存在类似的东西?
乔恩·斯基特(Jon Skeet):

在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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么将Optional <T>声明为最终类?

为什么以及何时需要在React中绑定函数和eventHandler?

为什么将接口声明为抽象?

为什么在Java中将String类声明为final?

为什么将函数参数声明为final?

为什么将Java接口方法声明为抽象方法?

为什么我们将Loggers声明为static final?

为什么将Java常量声明为静态?

为什么将Mapper和Reducer类声明为静态?

为什么java.util.Scanner类声明为'final'?

局部变量需要声明为final

如果使用fprintf,为什么内联函数需要声明为静态?

为什么我需要将这个函数声明为extern。没有它就可以工作

为什么将内置库函数声明为标识符名称是合法的?

为什么C ++编译器可以将函数声明为constexpr,而不能将其声明为constexpr?

为什么将类的特殊函数显式声明为“默认”

将函数参数类型声明为自动

将模板函数声明为非模板函数的参数

为什么不能将函数的参数声明为val或var

为什么在C#8.0中将局部函数声明为static

如果将A的通用子类型声明为return参数,为什么不能返回A的具体子类型?

何时以及为什么将Lambda函数映射到列表

我为什么以及何时要在Lua中使用os.exit()函数的参数“代码”

为什么以及何时需要双指针?

为什么将匿名JavaScript函数声明为函数参数?

为什么将Thread的isAlive()方法声明为本机?

为什么不能在没有参数的情况下传递声明为需要参数的swift函数?

为什么将变量类型p声明为新类型,而不是像p类型一样声明它呢?

为什么在从函数返回数组时需要将数组声明为静态数组。(C++)