当前位置: 首页 > 面试题库 >

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

郭云
2023-03-14
问题内容

目前,我正在研究Sams出版的《 24小时自学Android应用程序开发》一书。我是Java,Android或其他方面的新手。我在ActionScript
3中具有非常扎实的背景,该语言与Java具有足够的相似性,因此该语言本身并不难掌握,但对于本书中某些代码示例的基本原理,我仍然存在一些疑问。例如,以下是第9小时的示例代码随附的函数:

private void processScores(final TableLayout scoreTable, 
      XmlResourceParser scores) throws IOException, XmlPullParserException{

在此函数签名中,作者已将scoreTable参数声明为final。我为他们为什么这么做感到困惑。甚至没有尝试为函数参数scoreTable分配新值的想法(在ActionScript中被认为是不好的做法)。而且,在我研究或移植到AS3的任何实际Java中,我实际上都没有看到任何人这样做。

关于Android开发,是否有某些特定要求使得有时需要将某些函数参数声明为final?

为什么将TableLayout对象声明为final,而不声明为XmlResourceParser?


问题答案:

您可能想标记一个参数有两个主要原因final。首先,如果您打算在匿名内部类中使用该参数,则必须对其进行标记,final以便可以在该类中对其进行引用。实际上,这是将参数标记为final的非常普遍的用例。

标记参数的另一个常见原因final是防止自己意外覆盖它们。如果您确实不想更改参数,那么也许您 应该对其进行
标记,final这样,如果您确实进行了更改,就可以在编译时得到错误,而不是在运行时发现代码中有错误。



 类似资料:
  • 我有一个全局函数是这样的: 然后在另一个类中,我要将这个函数声明为的朋友。所以我做了: 现在,当我调用时,它无法编译,错误是foo无法访问的私有构造函数。我无法理解该错误,如何正确声明为的朋友? 提前道谢。

  • 我习惯像这样声明数组内联: 为什么我不能对函数执行相同的操作?假设我有一个类,其中包含and 方法,这是有效的: 但是,这不是: 它不喜欢内联数组声明,编译器错误是“不能创建函数的泛型数组” 编辑 我认为我的问题不是建议的副本,因为我想使用数组初始值设定项语法静态定义一组函数

  • 问题内容: 我是Python的新手,正在尝试使用tkinter编写程序。为什么执行下面的Hello函数?据我了解,仅在按下按钮时才会执行回调?我很困扰… 问题答案: 在为其Button分配参数时调用它: 如果要传递函数(不是返回值),则应改为: 通常是一个函数对象,就是函数返回的结果。看看这是否有帮助: 如果要传递参数,则可以使用lambda表达式构造无参数可调用对象。 简而言之,因为它位于lam

  • 问题内容: 将接口声明为抽象有什么意义?接口方法也是如此。有什么意义吗? 例如。 问题答案: 您在哪里遇到过已发布的代码块,任何旧的Java代码库? 这就是 JLS不得不说: 9.1.1.1抽象接口: 每个接口都是隐式抽象的。该修饰符已过时,不应在新程序中使用。 9.4抽象方法声明: 为了与Java平台的较早版本兼容,出于风格考虑,允许但不鼓励为接口中声明的方法冗余地指定abstract修饰符。

  • 问题内容: 代码是: 该按钮不起作用,它在没有我的命令的情况下打印了“hey”和“ het”一次,然后,当我按下按钮时,什么也没发生。 问题答案: 考虑以下代码: 它的功能与此完全相同: 该选项引用了一个函数,这是你需要向其传递函数名称的一种奇特的方式。要传递引用,你必须仅使用名称,而不使用括号或参数。例如: 如果要传递诸如“her”之类的参数,则必须使用一些额外的代码: 你可以创建一个无需你的参

  • 问题内容: 当我得知该类在Java中被声明为final时,我想知道为什么会这样。那时我没有找到任何答案,但是这篇文章:如何在Java中创建String类的副本?让我想起了我的疑问。 当然,String提供了我所需要的所有功能,而且我从未想过需要扩展String类的任何操作,但是您仍然永远不会知道有人可能需要什么! 那么,有谁知道设计师决定将其定稿时的意图是什么? 问题答案: 将字符串实现为不可变对