java:示例中不可变对象的优点
|
没有找到相关结果
已邀请:
8 个回复
bab
您可能想知道,什么值传递给bar()? 假设foo()是一个大型复杂函数。在此示例中,我绝对知道foo完成时,我仍然等于17,因为Integer是不可变的。如果不是真的,我将必须研究foo才能确定它是否可能被更改。 这是一个稍微复杂的例子。假设我有一些类似于Integer但可变的对象。让我们将其称为MutableInteger。然后说我写这个:
您是否看到上述问题? neededInventory和currentInventory指向同一对象。所有的加法和减法实际上都作用于相同的值,而不是两个不同的值,因此,当我们进行测试时,它将始终相等。如果对象是可变的,则上面的代码将永远无法工作。如果它们是不可变的,则加法和减法将必须返回结果对象,而不是就地更新,这将起作用。 多年前,我使用了Fortran编译器,其中整数是可变的。我们有一个接受几个参数的函数,其中一个是整数。在极少数情况下,函数会更新整数。然后有一天,有人对此函数进行了调用,将常量“ 2”作为整数传递。该函数决定更新参数,从而将“常量” 2更改为1!程序中使用常数2的每个其他位置现在都神秘地取值为1。这花费了很长时间进行调试。
蔬谢窗港
师埠女
并且String类不是不可变的,则
的调用者可以修改
,这可能不是所需的行为;系统的其他部分可能不希望或期望ѭ4更改。因此,调用者只能更改
指向的对象,而不能更改
本身。
填盖
醒荒捆府绣
。您可以将它们传递,连接,获取子字符串等,而无需考虑其他地方。如果它像C / C ++
一样易变,则始终需要牢记这一点。 出于相同的原因,它还导致了更具可读性和可维护性的代码。无需关心对象的其他用户。 这两个原因导致我们进入另一个重要的模式,称为值对象。简而言之,当您关心某个特定值(日期,数字,字符串,间隔,金钱或一些稍微复杂的对象(如果需要))时,这很有意义,但是值本身没有身份,即它具有无论上下文如何,其含义完全相同。
砷竣阿
可能是Java中使用最多的不可变对象。阻止该字符串的用户更改其内容是不变的。如果“ 8”是可变的,则意味着每个用户都必须创建该字符串的唯一副本,以确保没有其他人对其进行更改。 不变的数据也具有安全隐患。例如,与用户关联的安全令牌应该是不可变的,否则流氓程序可能会轻易更改与该令牌关联的用户。
死搭胯
括宠
类就是一个很好的例子: 关于不可变对象的原因的很好总结可以在这里找到