我遇到了这个(对我来说很奇怪)一段代码。我实际上从来没有见过这个用过的,也从未用过它,所以这很令人困惑......这就是
public static void fillData(HashMap<Object, Object> dataMap){
dataMap.put("key","value");
}
现在这非常令人困惑,因为我学习你的方式更像是这个
public static HashMap<Object, Object> fillData(){
HashMap<Object, Object> dataMap = new HashMap<>();
dataMap.put("key","value");
return dataMap;
}
现在有时候我应该使用这种方式吗?我仍然是编程的新手,但我还没有找到关于这种结构的任何内容。
我也进行过实验,发现这只适用于对象,而不是原语......
答案 0 :(得分:3)
好吧,考虑一下该方法操纵现有的非空映射的情况。在这种情况下,第一个例子非常有意义。
答案 1 :(得分:1)
我早上在谷歌上搜索同一主题并遇到 this discussion,其中说明了第一种形式
public static void fillData(HashMap<Object, Object> dataMap){
dataMap.put("key","value");
}
被认为是“不良做法,残余或OOP时间之前。”
答案 2 :(得分:1)
在java上,一个方法参数,它不是保存对象引用的原始参数。 在你的例子
public static void fillData(HashMap<Object, Object> dataMap){
dataMap.put("key","value");
}
dataMap引用一个对象,对该对象的任何更改都会影响显示该对象的整个系统引用。
例如;
public static void fillAll(){
HashMap<Object, Object> dataMap1 = new HashMap<>();
HashMap<Object, Object> dataMap2 = dataMap;
HashMap<Object, Object> dataMap3 = dataMap;
//dataMap1, dataMap2, dataMap3 are same object's references.
fillData1(dataMap1);
fillData2(dataMap2);
fillData3(dataMap3);
//here dataMap1 holds 3 different values in it.
//dataMap2, dataMap3 still same as dataMap1
dataMap3 = new HashMap<>();
//here dataMap3 have a new object's reference but dataMap1 and dataMap2 still have 3 values in the map object.
//primitive types are different they are holding values directly.
int x = 5;
int y = x;
x++; //now x value is 6 but y value is still 5
}
public static void fillData1(HashMap<Object, Object> dataMap){
dataMap.put("key1","value1");
}
public static void fillData2(HashMap<Object, Object> dataMap){
dataMap.put("key2","value2");
}
public static void fillData3(HashMap<Object, Object> dataMap){
dataMap.put("key3","value3");
}
答案 3 :(得分:1)
我遵循的做法基于两种情况:
场景1.如果调用方法对传递给方法的复杂对象进行更改,则更有意义的是修改传递的对象并从方法中返回任何内容(void)。对象在java中按值传递(此处的“值”是指复制并传递的对象引用信息),因此任何修改都将更新对象的主副本,并且不需要从方法返回任何内容。
场景2.如果调用方法使用复杂对象,运行一些逻辑并准备另一种类型的复杂对象,则从该方法创建并返回此新对象是有意义的。
回到你的问题 - 它是一个静态方法,因此它的实例独立。我可以再次想到两种可能的情况:
场景1-如果您的“dataMap”可以在此方法调用之前启动,并且它可能已经有一些其他键值对,那么传递此“dataMap”并让该方法更新此相同的映射更为简单键值对。在这种情况下,不会返回任何内容。
场景2-如果你的“dataMap”在这个方法调用之前总是应该是一个新的空地图,那么我没有看到任何理由创建Map实例并在方法中传递它。如果方法创建此映射并以方法返回参数的形式返回,那么代码行将更少且更简单。
根据特定情况,这两种方式都具有适用性,我不会说一种方式比其他方式更好。
答案 4 :(得分:0)
让我们看一下这些API的用法(由HashMap
替换Map
,使用接口代替具体实现总是更好):
Map<Object, Object> data = new Map<>();
fillData(data);
这样的传递参数创建副作用代码,这在API中是不可见的。所以最好让方法返回结果,这样也可以变得更流畅:
Map<Object, Object> data = fillData(new HashMap<>());
如果之前地图中有“key”值,会发生什么?它会被替换吗?通过返回原始地图的副本,该方法也可以避免副作用:
public static Map<Object, Object> filledData(Map<Object, Object> original) {
Map<Object, Object> result = new HashMap<>(original);
result.put("key","value");
return result;
}
功能方法独立于初始状态:
Map<Object, Object> data = createFilledData();
使用方法一如既往地取决于要求。这是公共API还是内部帮助方法?谁会使用它,新手或专家?表现怎么样?