【问题标题】:Should I make all parameters in Java/Android final?我应该将 Java/Android 中的所有参数设为最终参数吗?
【发布时间】:2014-08-18 16:44:17
【问题描述】:

this answer 中声明您永远不应该更改您分配的参数,最好是Java 强制参数始终是最终的。我个人同意并且从不这样做。如果我想对参数进行一些更改然后再次返回它,我会在方法中创建一个本地副本,更改有关该副本的内容,然后返回该副本。

这让我想知道,我是否应该将我的 Android/Java 项目中的所有参数都设置为最终参数,或者是否存在我不想这样做的情况?

我脑海中突然出现的一些问题:

  • @Override 方法的参数设为final 是否会有所不同?
  • 作为上一个问题的后续:我打电话给super(my_final_parameter); 有关系吗?
  • 再次跟进:使用默认 Java/Android extendssuper(my_final_parameter);,这些 Java/Android 类在幕后是否有任何情况使用该参数,所以我不能让它们最终化?李>

如果对于上述情况(或您可能想到的其他情况)而言,参数是否为 final 无关紧要,那么将方法/构造函数/重写方法的每个参数设为 final 是否是个好主意?

【问题讨论】:

  • 实际上有些情况下您想更改参数。例如,如果您想“返回”多个参数,您可以发送多个参数,在方法中更改它们,然后当方法退出时,您知道变量已被“返回”/更改/更新。我知道该示例可能不是理想的代码,但我确实相信将所有参数设置为最终参数会给您带来一些令人头疼的错误。这当然取决于项目的规模和实施,但作为一个总体思路,我不会将所有这些都定为最终结果。
  • @Pphoenix 因为java是按值传递修改你的参数对你传递的变量没有影响,因此发送多个参数,在你的方法中更改它们,然后在方法退出时你知道变量已经“返回”/更改/更新是错误的。

标签: java parameters overriding final superclass


【解决方案1】:

由于Java is pass-by-value and not pass-by-reference,修改参数不会对原始变量产生影响。

final 添加到您的参数中可以避免任何人(以及您)必须修改您的代码才能在此“错误”中运行。所以这取决于你,如果你想确保不要试图修改你的参数,认为它会修改你的变量,请使用final

我个人不使用这种做法,因为我知道这种行为(而且我的第一语言是 java)。

至于您弹出的问题,他们完全理解了上述内容。重写方法只是超级方法的不同实现,超级参数与其运行时行为无关,因为选择了重写方法。同样调用 super(final_var),因为 java 是按值传递的,只是将值传递给超类,而 final_var 保持不变,因此不违反 final 修饰符。

【讨论】:

  • 这就是我对你最后陈述的意思。如果您在超级方法中传递 final-var,并且在该扩展类中(在幕后)他们会修改方法中的参数,那么由于超级方法中的 final-var 会导致错误。无论如何,因为它既能提高可读性,又能在其他人将来继续使用我的代码时,我只是将所有参数保留为非最终参数,除非是:passing a parameter to a different Thread。我刚刚遇到了 SO 问题,想知道它是否会有所不同。
猜你喜欢
  • 2021-10-08
  • 2015-02-18
  • 2019-07-20
  • 1970-01-01
  • 2021-08-26
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多