【问题标题】:Why declare a function argument to be final?为什么将函数参数声明为 final?
【发布时间】:2011-06-23 05:46:29
【问题描述】:

我目前正在阅读 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?

【问题讨论】:

标签: java android final


【解决方案1】:

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

标记参数final 的另一个常见原因是防止自己意外覆盖它们。如果您真的不想更改参数,那么也许您应该将它们标记为final,这样如果您真的这样做了,您将在编译时收到错误,而不是在您的代码有错误的运行时。

【讨论】:

  • 谢谢,我绝对不知道关于匿名内部类的这个要求。那么基于只有 TableLayout 对象被声明为 final 的事实来推断该函数严格使用它来防止粗心编码是否安全?为什么在这种情况下它比 XmlResourceParser 更特别?还是只有这些问题作者可能知道答案?
  • @scriptocalypse- 你知道,我不确定。我猜这是针对匿名内部类案例的,否则您是对的,将它们都标记为最终更有意义。不过,我不能代表作者发言。也许你可以联系他们或出版商?
  • 其实anonymous inner class case本身就是一个很好的理由。在 Android 中,我发现自己经常使用 OnClickListenerAsyncTask 类,并且直接在其中重用这些变量的能力非常方便。另一个审核链接:developer.android.com/guide/practices/design/….
  • 优化怎么样? final 关键字对此有帮助吗?那么标记为 final 的 Object 参数呢?您仍然可以编辑更改他们的字段,iirc。
  • 请注意,与 C++ const 参数不同,似乎不会阻止 final 参数在内部被修改。
猜你喜欢
  • 2017-10-05
  • 2011-10-02
  • 2011-07-03
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
相关资源
最近更新 更多