Java 在我们确定方法没有';不返回空值?

Java 在我们确定方法没有';不返回空值?,java,android,methods,null,return,Java,Android,Methods,Null,Return,我有一个方法,如果满足参数的条件,它可以返回null。比如说 public static ObjectA newObjectA(String param) { ObjectB objB = new ObjectB(); ObjectA objA; if (param == null) { return null; } // do something else return objA; } 如果在检查nullif(param=

我有一个方法,如果满足参数的条件,它可以返回null。比如说

public static ObjectA newObjectA(String param) {
    ObjectB objB = new ObjectB();
    ObjectA objA;

    if (param == null) {
        return null;
    }

    // do something else

    return objA;
}
如果在检查null
if(param==null)
之后移动objB的初始化是否更好?它将是这样的:

public static ObjectA newObjectA(String param) {
    ObjectB objB;
    ObjectA objA;

    if (param == null) {
        return null;
    }

    objB = new ObjectB();

    // do something else

    return objA;
}
是否有任何改进,比如避免objB的内存使用?或者,如果我像这样检查null参数之后移动对象的声明,会更好吗

public static ObjectA newObjectA(String param) {
    if (param == null) {
        return null;
    }

    ObjectB objB = new ObjectB();
    ObjectA objA;

    // do something else

    return objA;
}

谢谢大家。

这种方法更好-

public static ObjectA newObjectA(String param) {
    if (param == null) {
        return null;
    }

    ObjectB objB = new ObjectB(); // Occupied the memory required by for member variables of ObjectB along with the references
    ObjectA objA; // Occupy 4 bytes or 8 bytes as explained below.

    // do something else

    return objA;
}

因为尽管未初始化的对象不占用太多内存,但它们确实占用了存储其引用所需的大量内存。32位系统的内存为4字节,64位系统的内存为8字节。

不要担心“内存”;相反,考虑在条件(包括新的)之前所做的工作的副作用意味着。例如,如果构造器(出于某些非常模糊和不酷的原因)抛出异常,会发生什么?因此,这样的一般模式是不等价的。这可能会很有帮助。如果没有必要,最好不要分配内存,但就您正在共享的示例而言,这并没有多大意义,因为这是非常理论化的。归根结底,它总是取决于实际方法的作用。方法的null返回不仅取决于参数,还可能由于objA或objB或其他原因而返回null。因此,首先检查参数是否为null通常是一种很好的做法,但它不是null并不意味着该方法最终不会返回null,您基本上不能这样假设。感谢链接@MiquelPerez是的,实际上,在我确保
param
不为null之后,我使用
switch(param)
再次检查它。如果它与
案例
s中的任何值都不匹配,则该方法在
默认
案例中返回null。因此,如果
param
既不为null,又与任何
案例
匹配,则可以保证最后一个代码
return objA
将不为null,因为在每种情况下
objA
都是初始化的。在C#中讨论这种方法级别的“内存优化”对于一般应用程序来说是不可取的。。没有实际意义(相反的案例最好是用经验数据得出的)。因为它是一个非常短暂的对象,所以GC要处理它是一个“优化良好”的情况(假设构造函数没有做任何有趣的事情),即使它需要一点点额外的工作。@user2864740是的,我同意你的看法。对于上面提到的例子,这并不重要,但我只是提供了一个一般性的解释,以便更好地理解引用和对象。这种方法不仅在性能级别上是最好的,而且还满足了快速失效模式。所以,这是最好的代码设计。我同意fail-fast模式。但我还需要确保在我的第一种方法中,
objB
会发生什么。假设给定的
param
为null,因此初始化
objB
,然后该方法返回null。当该方法完成时,
objB
是否仍保留在内存中,还是因为从未使用过而立即从内存中删除?