将对象引用传递给方法(作为参数)并修改该方法中的对象,或者该方法是否应该返回对新对象的引用?最佳做法是什么?为什么?
答案 0 :(得分:4)
默认情况下,将对象传递给方法时,您将通过引用进行传递。如果对象应该是不可变的,那么就这样设计它们(例如String
)。
答案 1 :(得分:1)
我会说最好的做法是修改方法的this
对象。最好不要修改作为参数传递的对象,即使它们是可变的。如果要返回一个链接对象,通常最好是return this;
而不是参数。
答案 2 :(得分:0)
是否应该将对象引用传递给方法并在方法中修改它们或者让>方法返回新的引用?
它没用..为什么要回归?
它应该主要在不可变对象的情况下返回。
例如
bigDecimalOb3 = bigDecimalOb1.add(bigDecimalOb2);
答案 3 :(得分:0)
我会比接受的答案更进一步,并说(一般情况下)不要将对象(或严格来说对象引用)作为参数传递给方法。
在实践中会发生什么事情,你最终会得到不清楚的代码,因为我将尝试在下面的例子中说明一个非常熟悉的例子,在业内工作的人看到:
比较一下:
Employee emp = ...;
Validator.checkIsEligibleForPPCTP(emp);
用这个:
Employee emp = ...;
Validator.checkIsEligibleForPPCTP(emp.getEmailAddress());
到底是什么PPCTP
?无论PPCTP是什么,您都需要领域知识。所有你知道的是它会查看员工对象并做一些事情。
另一方面,如果你避免传递整个对象而只是传递实际相关的东西,那么读者可以更多地了解正在发生的事情而不必检查checkIsEligibleForPPCTP
的定义。我打赌你可以更容易地想象验证方法的作用是因为我们正在向它发送一个电子邮件地址(事实上,即使你的想象力稍微有点错误,在谈到代码时,叙述通常也足够好理解)。
但是,如果我们将来需要来自这个广泛对象的另一个领域呢?您必须修改签名。
哦,多么可怕,我不想让别人为此鞍座,没有其他人像我一样聪明(好的改变签名需要一些关心,但有更好的解决方案,而不仅仅是将宇宙传递给一个简单的方法)。
此tweet是" prefactoring"的答案。 /编程"为了未来" (它适用于方法级设计):
错误的抽象比没有抽象更具破坏性。 每次都在等待猜测。
是的我知道java.lang.String
是一个对象。通常你必须通过java.util.Collection
。这些不同于"自定义对象"这是因为:
如果你坚持传递一个对象,至少要使它不可变。但是如果你的emp对象是TLOYDEmployee
,那么你再次在努力理解代码的意图方面是有障碍的,而你所要做的只是对商业术语含义的共同理解(使用 - 重用悖论) )。