是否有命名变量的标准,以表明它们在Java中被引用修改?

是否有命名变量的标准,以表明它们在Java中被引用修改?,java,pass-by-reference,naming,Java,Pass By Reference,Naming,这并不理想,但我有一个函数(private)可以通过引用编辑对象。如下所示,其中有效负载是变异的对象: void extractDataForConfigIntoPayload(Map<K,V> payload, Object obj1, ..) { // mutate payload purposefully } void extractDataForConfigIntoPayload(映射负载,对象obj1,…){ //有目的地改变有效载荷 } 我试图在编写这个函数时

这并不理想,但我有一个函数(private)可以通过引用编辑对象。如下所示,其中
有效负载
是变异的对象:

void extractDataForConfigIntoPayload(Map<K,V> payload, Object obj1, ..) {
   // mutate payload purposefully 
}
void extractDataForConfigIntoPayload(映射负载,对象obj1,…){
//有目的地改变有效载荷
}

我试图在编写这个函数时不加任何注释,同时尽可能保持它的描述性。命名变量(如
payload
)的好习惯是什么?这些变量是通过引用修改的,作为方法的故意副作用?在这种非常特殊的情况下,C++要求严格的语法似乎有帮助,因为指针是明确的指针,地址是明确的地址,等等。

最好的办法是不要修改
有效载荷
变量,然后在函数内部创建一个新的
映射
,并返回新的
映射

例如:

Map<K, V> extractDataForConfigIntoPayload(Map<K,V> payload, Object obj1, ..) {
   // create new map and return the new map, leaving payload untouched
   return myNewMap; 
}
Map extractDataForConfigIntoPayload(映射有效负载,对象obj1,…){
//创建新地图并返回新地图,保持有效负载不变
返回myNewMap;
}

请注意,这种编码虽然优先处理干净的代码,但效率不如修改原始的
有效负载
映射。

没有真正的命名约定。无法标记将由该方法修改的参数。但是,您可以将不应修改的参数标记为
final

例如:

void extractDataForConfigIntoPayload(Map<K,V> payload, final Object obj1, ..)  {
   // mutate payload purposefully 
}

void extractDataForConfigIntoPayload(映射有效负载,最终对象obj1,…){
//有目的地改变有效载荷
}

这将确保您不会意外地修改假定为不可变的对象。

payloadToMutate
,或
payloadByRef
。不,没有这方面的标准,就像通常很少有命名变量的标准一样。
Ref
在名称的末尾,但我不明白为什么需要这样做,我建议在Java中使用不可变方法(即创建新副本),所有对象都按值传递;没有所谓的参照传递。但是,您可以更改传递的值所引用的对象。更好的做法是使用Guava
ImmutableMap
,而不仅仅是
Map
作为参数类型。这在理论上是一个很好的建议。实际上,您可能不需要保留贴图的先前值,但可能需要挤出高性能应用程序的最后一纳秒,并且不希望为了更改一个值而不必要地复制整个贴图的开销。因此,这取决于您的应用程序。有时候你的建议应该被遵循,但不是所有类型的应用都应该遵循。我想补充一点,我不太喜欢牺牲效率而忽略干净的代码。它们可以在同一个方法中共存。由于没有命名变量的约定,我更喜欢在方法签名中明确说明。将obj1标记为final不能保证对象本身不会被修改;它只保证该方法不会更改变量obj1以引用不同的对象,该对象只在方法体中起作用,因此它只是方法调用方不需要知道的实现细节。