Java 语言构造表明参数不会发生变化?

Java language constructs to indicate that an argument won't be mutated?

我有一个带有多个参数的方法,其中一些参数将在方法内部更改。有些只读。客户端(调用此类方法的代码的其他部分)提供对象实例作为参数。

java 语言的哪些构造可用,让我可以声明参数不应该、不会或不能在方法内部发生变化。像注释或关键字这样的构造,告诉客户该方法不会更改在方法调用中用作参数的对象实例。如果我(作为此类方法的实现者)尝试在方法实现中意外地改变对象,也会生成编译错误或警告的构造。

我知道关键字 final 但这只是为了确保参考没有更新。

不可变性不是解决方案,因为在其他方法(或我的应用程序中的其他地方)中,我希望该类型的实例是可变的,仅在此方法调用中,我想给出一个 "promise"给客户,我不会更改他作为参数提供的实例。

深度复制或克隆参数或让客户端(调用者)做这样的事情是没有必要的,因为无论如何改变实例都不是方法逻辑的一部分。我只是想知道该语言是否有助于仔细检查这不会发生。

您正在寻找不变性final 确保不能更新引用,但仍然可以更改可变字段。通过使 class 不可变 的实例,您可以确保实例的值永远不会改变。

勾选strategy for defining immutable Objects

如果你不想让你的实例不可变,你仍然可以通过传递一个 防御副本 / 深复制实例.

那里没有适合您的纯粹 java 解决方案。

如您所述,final 关键字只会确保不能为该引用分配新值。

您可以使用的一种预防措施是根据情况克隆或环绕您的可变参数。

有一些(繁琐的)技术可用于深度克隆集合和地图(有关 SO 中的快速示例,请参阅 here and here)。

最终,一个表现良好且详尽的 javadoc 可以在此处提供适当级别的文档。

无法将参数定义为只读(仅您已经提到的)。但是,您可以使用 builder pattern 来构建传递的对象,这样构建的对象将只有 getter 方法,因此它不会有 setter 方法,使其有效地不可变(注意反射仍然可以用来修改它的字段).