我在许多库中看到,当返回一些结果时,使用返回a = new A()
(例如return entrySet = new EntrySet()
)而不是仅返回new EntrySet()
,有什么区别?
答案 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
字段的延迟初始化。我想这对于那种事情是有意义的。