是否有命名变量的标准,以表明它们在Java中被引用修改?
这并不理想,但我有一个函数(private)可以通过引用编辑对象。如下所示,其中是否有命名变量的标准,以表明它们在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,…){ //有目的地改变有效载荷 } 我试图在编写这个函数时
有效负载是变异的对象:
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中使用不可变方法(即创建新副本),所有对象都按值传递;没有所谓的参照传递。但是,您可以更改传递的值所引用的对象。更好的做法是使用GuavaImmutableMap
,而不仅仅是Map
作为参数类型。这在理论上是一个很好的建议。实际上,您可能不需要保留贴图的先前值,但可能需要挤出高性能应用程序的最后一纳秒,并且不希望为了更改一个值而不必要地复制整个贴图的开销。因此,这取决于您的应用程序。有时候你的建议应该被遵循,但不是所有类型的应用都应该遵循。我想补充一点,我不太喜欢牺牲效率而忽略干净的代码。它们可以在同一个方法中共存。由于没有命名变量的约定,我更喜欢在方法签名中明确说明。将obj1标记为final不能保证对象本身不会被修改;它只保证该方法不会更改变量obj1以引用不同的对象,该对象只在方法体中起作用,因此它只是方法调用方不需要知道的实现细节。