Oh *_*oon 2 java pass-by-value
如果Java是非原语的严格传值,那么建立编码标准是不是更好,比如使方法和构造函数的所有形式参数最终? - 避免混淆?
如果Java是非原语的严格传值
对于所有参数和所有结果,Java都是严格按值传递的,无论类型如何.
如果您不理解,或者不相信我,请阅读Java是Pass-by-Value,Dammit!
...我可以在形式参数中强制使用最终修饰符吗?
是的,你可以,但出于你给出的原因这样做是不错的主意.
声明方法或构造函数的形式参数意味着与您尝试放置的含义final 不同.具体来说,这意味着无法在方法/构造函数的主体中分配参数.
这样做会产生以下后果:
它实际上会以某种方式改变代码的含义,在某些情况下可能会导致编译错误.(这些是很好的编译错误......因为它们迫使程序员停止做一些通常会使他的代码不那么清晰的东西.但是修复需要付出努力并需要重新测试等等)
经验丰富的Java程序员不会读到你想要的含义.(并不是说它们需要提醒......).
新手Java程序员可能会更加困惑......特别是如果他们发现错误的概念,即声明某些东西会final改变传递语义的参数!
所以这不符合你的目标.
真正的解决方案是教育人们Java始终使用传值.(这包括殴打那些坚持传播虚假信息并对此表示怀疑的人......就像你的问题一样!)
(几乎在所有情况下,最好不要更新正式参数,并且声明它们会final阻止你意外地执行此操作.所以这是一个很好的做法.但这是好的做法的原因并不是你所说的......如果你确实把它放到了一个编码标准中,你给出的理由是,你应该受到全面的批评.)
如果您不理解,或者不相信我,请阅读Java是Pass-by-Value,Dammit!
Shahzeb评论说Java不会为非原语传递价值; 它是非基元的值传递,因为它将引用的值传递给非基元.但是,在将对象传递给函数时,它不会复制对象.
final形式参数列表中的修饰符不应以某种方式影响调用者,因为方法接收引用的副本和基元的副本; 它们不会影响调用者代码中的引用和原始值.该final修改并不能阻止通过被改变的可变对象final引用. final只能对它所使用的方法中的代码有任何帮助.
(如果我错了,有人会纠正我,但我相信这是正确的.)
| 归档时间: |
|
| 查看次数: |
267 次 |
| 最近记录: |