将引用传递给对象或在Java中的对象中传递单个属性是否更好?

时间:2012-05-16 09:42:22

标签: java parameters

我正在处理遗留代码,并且我经常看到方法调用具有来自同一对象的多个属性传递给方法:

update(user.getID(), user.getLanguage() etc...)

这样做是否有明显的优势或劣势,或者我也可以传入用户对象(在本例中)并处理名为?的方法中的属性?

跟进:

很多优秀的答案,谢谢。对于问题中缺乏确切细节的道歉,但正如我所说的那样,我正在研究整个系统,这似乎是一个很好的简单例子。请随意将此问题转变为社区维基问题,因为没有人可以接受其他答案,因为他们都很好,并且有正确的分数。

9 个答案:

答案 0 :(得分:15)

两者都有其优点。我决定每种方法取决于它应该做什么。但是对于遗留代码,除非确实存在问题,否则我宁愿不改变任何内容。

Pro几个值,con object reference:

  • 您没有绑定到特定的类,您可以传递来自其他来源的值
  • 方法不能(意外地)改变对象状态(C ++可以使用“const”)

Pro传递单个用户对象:

  • 您已绑定到用户对象,因此很难意外传递无关/无效值
  • 很明显,该方法需要用户对象的数据
  • 更改(例如重命名)getter需要在方法的所有调用中进行更改,而不仅仅是在其实现中
  • 类似,如果添加了新属性并需要传递
  • 方法可以改变对象状态

如您所见,根据您的需要,物业可视为优势或劣势。

答案 1 :(得分:13)

事实上,传递对象的引用会更好,更多,原因有两个:

  • 它避免重复调用该方法的每个地方的所有getter(DRY原则)
  • 它导致更短的方法签名。方法几乎不应该有三个以上的参数,因为它太容易混淆顺序,很难重构。

为了避免过长的参数列表,建议的重构是创建一个包含所有数据的对象 - 您是否已经拥有这样的对象并不幸运?

答案 2 :(得分:5)

这取决于您是否接受来自调用方法的对象类的依赖性。

使用此时

update(user)

声明更新的类必须知道用户的类。

如果你使用这个

update(user.getID(), user.getLanguage() etc...)

并且成员是原始的或属于Java标准库,而update()对用户类没有进一步的依赖...

答案 3 :(得分:3)

  1. 看起来很奇怪
  2. 这意味着方法签名看起来像update(String, String, String...),这会导致以错误的顺序传递参数的风险
  3. 如果您需要在某个阶段在更新方法中考虑新属性,则无需更改方法的签名,只需更改其实现。
  4. 我不知道update做了什么,但让它成为用户类的一部分可能是有意义的:user.update(additionalInformation)

答案 4 :(得分:3)

根据我的经验,我认为这取决于方法应该做什么,如果它严格链接到包含所有参数的对象,最好传递对象,例如在执行更新的DAO对象中或保存最好传递Domain对象,否则如果方法更通用,并且有可能所有参数都不是来自同一个对象,最好将参数传递给方法。

答案 5 :(得分:3)

这是一种代码气味,可以让我考虑将update()方法移动到用户类。面向对象设计的一个重要原则是encapsulation - 将您的数据和对该数据的操作捆绑在一起。

然后你有Tell, Don't Ask原则。告诉对象做某事比向它索取信息更好。

  

程序代码获取信息然后做出决定。面向对象的代码告诉对象做事。

当然我没有足够的细节说你绝对应该做这样的事情,但这是需要考虑的事情。

答案 6 :(得分:2)

从您的代码段中说出您的方法更新有点难。但是,如果传入用户对象,则会将用户对象加到该方法中。如果您只传入字符串,整数等,则可以将该方法与user以外的其他来源一起使用。我的建议是,你不应该强迫方法比它需要的更具体。

答案 7 :(得分:2)

考虑到您正在处理遗留代码,您需要确保更改方法

签名不会破坏任何可能正在调用它的代码。如果您完全控制将调用这些方法的代码库,那么您可以通过传入user对象来简化代码。

每次调用这些方法时,您还应该考虑用户是否对象是一个“重量级”对象,该对象会加载可能浪费的额外数据。这可能是您不能将user对象作为参数传递的一个原因。同样的原因适用于延迟加载的对象。

不传递整个对象的另一个可能原因可能是你不希望它被方法更新,并且“某些原因”不能成为不可变的。可以使用户对象的getter方法返回值的“安全防御副本”。请参阅Joshua Bloch对这种编码实践的有效java,这在多线程应用程序中尤其有用。

答案 8 :(得分:2)

一个对象的属性作为方法的单独参数传递没有任何好处。它的缺点是代码变得难以阅读和维护。争论越少越好。如果你可以在一个对象中组合参数,那就去做吧。

有一种重构技术,如果你想重构它,称为Preserve Whole Object。您可能还会发现类似主题的answer有用。