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

How does one know if a certain method will change the state of a java object?

有些方法是增变方法,通常它们 return 什么都不是,即所谓的设置器。其他的,比如LocalDate的.plusDays()方法class,return一个Localdate类型的完整实例化对象,所以如果你想改变对象,你需要将你现有的对象变量指向新创建的。

除了查看它的 return 值之外,有没有办法预先知道一个方法是否是一个修改器,或者像前面提到的那样工作?

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

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

没有通用的方法来判断 return 某些方法是否也有其他 side-effects 方法。

如果类型是 immutable you can be confident that none of its methods will mutate its own state, but then the question has simply shifted to "how do you tell whether a type is immutable or not?" This is easier to answer, but still tricky. Static analysis tools like ErrorProne's @Immutable 检查是有帮助的,但仍然容易出错。

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

例如在 Builders 中找到的方法(如 Builder withProperty(PropertyType property))可以自由选择是更新实际实例的状态还是创建 return 持有更新后的新实例 属性 .

最终光看方法是无法预知到底选择了哪一种实现策略,所以还得看文档(有时还要看代码)。