为什么值会在方法之外发生变化?
Why does the value change outside of the method?
我有这个代码:
private MyClass myMethod(HashMap<MyEnum, String> preferences, String type){
// stuff
preferences.put(MyEnum.enum, type);
MyClass myClass = ExtractMyClass(preferences);
return myClass;
}
我在这里调用这个方法:
public List<MyClass> myBigClass(){
List<MyClass> myList = new ArrayList<>();
//do a lot of stuff
Map<MyEnum, String> preferences = new HashMap<>();
preferences.put(MyEnum.enum, "value0");
myList.add(myMethod(preferences, "value1")); //first call
myList.add(myMethod(preferences, "value2")); //second call
myList.add(myMethod(preferences, "value3")); //third call
return myList;
}
在第一次调用中,preferences
仅包含 value0
在第二次调用中,它包含 value0
" 和 value1
而在第三次调用中,它有 value0
、value1
和 value2
我想要,对于三个调用,preferences
应该只有 value0
为什么其他值保留在那里,即使它是在方法中添加的?
当您将对可变实例的引用(例如 Map<MyEnum, String>
引用)传递给方法时,该方法可以改变该实例的状态(假设它可以访问改变实例的方法).
如果您希望 myMethod
不改变您传递给它的 Map
,您应该传递原始地图的副本。
因为每次在方法中传递参数时,您都没有创建地图的新对象,您只是在传递其引用,所以这意味着每次您的方法都获得相同的地图。
我有这个代码:
private MyClass myMethod(HashMap<MyEnum, String> preferences, String type){
// stuff
preferences.put(MyEnum.enum, type);
MyClass myClass = ExtractMyClass(preferences);
return myClass;
}
我在这里调用这个方法:
public List<MyClass> myBigClass(){
List<MyClass> myList = new ArrayList<>();
//do a lot of stuff
Map<MyEnum, String> preferences = new HashMap<>();
preferences.put(MyEnum.enum, "value0");
myList.add(myMethod(preferences, "value1")); //first call
myList.add(myMethod(preferences, "value2")); //second call
myList.add(myMethod(preferences, "value3")); //third call
return myList;
}
在第一次调用中,preferences
仅包含 value0
在第二次调用中,它包含 value0
" 和 value1
而在第三次调用中,它有 value0
、value1
和 value2
我想要,对于三个调用,preferences
应该只有 value0
为什么其他值保留在那里,即使它是在方法中添加的?
当您将对可变实例的引用(例如 Map<MyEnum, String>
引用)传递给方法时,该方法可以改变该实例的状态(假设它可以访问改变实例的方法).
如果您希望 myMethod
不改变您传递给它的 Map
,您应该传递原始地图的副本。
因为每次在方法中传递参数时,您都没有创建地图的新对象,您只是在传递其引用,所以这意味着每次您的方法都获得相同的地图。