“return new A()”和“return a = new A()”之间的区别是什么?

时间:2011-10-10 09:40:38

标签: java

我在许多库中看到,当返回一些结果时,使用返回a = new A()(例如return entrySet = new EntrySet())而不是仅返回new EntrySet(),有什么区别?

6 个答案:

答案 0 :(得分:6)

后者在返回前为a指定一个值。

如果a是局部变量,那几乎肯定无关紧要。如果a是实例(或静态)变量,则会产生可见的副作用。它有时用于一些惰性初始化,例如

private String foo;

public String getFoo()
{
    if (foo != null)
    {
        return foo;
    }
    return foo = computeFoo();
}

private String computeFoo() { .. }

答案 1 :(得分:3)

return a = new A()会将new A()的分配值返回给a。赋值的值是指定的值。

所以他们都返回完全相同的值。

然而 return a = new A() 将值分配给a。如果a是局部变量,那么这是一个不会产生任何影响的赋值,应该删除。如果a是一个字段,那么由于某种原因,这可能会用于记住最后返回的值。

在后一种情况下它会起作用,但我会说这是不好的风格(该行不止一件事。实际上它做了3件事)我会像这样重写它:

a = new A();
return a;

答案 2 :(得分:1)

首先想到的是“所以你可以在实际退出之前检查被调用方法中的返回值”。老实说,我一直以为两种方式都是等价的。

答案 3 :(得分:0)

如果它是一个局部变量,那么根本没有差别(即使是一些微不足道的优化之后)。这只是一个毫无意义的任务。但如果它是一个字段的赋值,那只是简写:

this.a = new A();
return this.a;

有些人喜欢单向做,有些则喜欢做。

答案 4 :(得分:0)

作业的结果是指定的值。

所以在

 private int x;

 public int setX(int x) { return this.x = x; }

setX方法将其参数分配给this.x并返回this.x的新值。

答案 5 :(得分:0)

不同之处在于,该值首先分配给变量然后返回。如果它是一个局部变量,这实际上没有任何影响,因为一旦方法返回它就会超出范围。如果它是一个实例变量就很重要。

但我从未见过这种事情,并认为这是一个相当可疑的做法。你看到它使用的“mnay图书馆”到底有什么特色?

更新:我刚刚看到它在java.util.HashMap中使用,显然是为了entrySet字段的延迟初始化。我想这对于那种事情是有意义的。