Java方法返回对象还是直接操作它?

时间:2016-02-25 19:58:11

标签: java methods return

我遇到了这个(对我来说很奇怪)一段代码。我实际上从来没有见过这个用过的,也从未用过它,所以这很令人困惑......这就是

  • 此处使用hashmap作为示例,但其他对象的行为相同
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;
}

现在有时候我应该使用这种方式吗?我仍然是编程的新手,但我还没有找到关于这种结构的任何内容。

我也进行过实验,发现这只适用于对象,而不是原语......

5 个答案:

答案 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还是内部帮助方法?谁会使用它,新手或专家?表现怎么样?