如何知道某个方法是否会改变java对象的状态?

时间:2017-09-21 06:15:58

标签: java methods mutators

有些方法是mutator方法,通常它们什么都不返回,即所谓的setter。其他的,如LocalDate类的.plusDays()方法,返回一个类型为Localdate的完整的实例化对象,因此如果要更改对象,则需要将现有对象变量指向新创建的对象。

有没有办法事先知道一个方法是一个mutator,还是像之前提到的那样工作,除了查看它的返回值?

2 个答案:

答案 0 :(得分:5)

不,没有办法知道(没有查看文档或实现)方法是否会改变某种状态。

返回void的方法通常会改变某种状态(否则他们在做什么?),但仍然无法保证将会改变(选项包括对象,它的一个字段,方法的参数,全局状态,甚至是JVM运行时本身。)

没有通用的方法来判断返回某些内容的方法是否还有其他side-effects

如果类型为immutable,您可以确信其方法都不会改变自己的状态,但问题只是转移到“如何判断类型是否是不可变的?”这更容易回答,但仍然很棘手。像ErrorProne@Immutable检查这样的静态分析工具很有帮助,但仍然容易出错。

答案 1 :(得分:1)

嗯,遵循模式void setProperty(PropertyType property)的纯粹的setter可能会修改内部状态(好吧,可以用不同的方式实现它,例如修改传递参数的状态,但这很奇怪)

例如,在构建器中找到的方法(如Builder withProperty(PropertyType property))可以自由选择是更新实际实例的状态,还是创建并返回包含更新属性的新实例。

最后,我们无法预见是否只是通过查看方法来选择一个或另一个实现策略,因此必须阅读文档(有时是代码)。