gpt4 book ai didi

java - 传递整个对象与传递对象的属性

转载 作者:IT老高 更新时间:2023-10-28 20:45:36 24 4
gpt4 key购买 nike

我正在考虑我的应用程序的解决方案。情况如下:我有一个类,其方法将 ObjectA 作为输入参数并调用几个小方法。这些方法中的每一个都需要 ObjectA 的某些部分(它们不重叠,即 method1() 需要 ObjectA.field1ObjectA.field2method2()需要ObjectA.field3等等...)

考虑到一般的良好代码实践和性能,将 ObjectA 传递给这些方法中的每一个方法更好,以便它们可以自己提取所需的值,还是只传递值更好?我的意思是:

method1(ObjectA);
method2(ObjectA);

method1(Object1.getField1(), ObjectA.getField2());
method2(ObjectA.getField3());

最佳答案

请记住,使用您的代码,您实际上并没有传递 ObjectA。即,您将引用类型传递给 ObjectA,因此在性能上请注意传递 String 对象引用和 ObjectA 对象之间的区别引用可以忽略不计。

我会这样写

如果方法与类相关,我会传递整个对象。我这样做的理由是尽可能地分割类知识。我的意思如下。

public void doSomethingRelatedToTheClass(String param)
{
// Do something with param.
}

我在这里的第一个批评是这种方法假设输入是正确的字段。我的第二个问题是,现在调用这段代码的类需要更多地了解这个方法,因为它必须像这样调用它:

doSomethingRelatedToTheClass(myObject.getValue());

这意味着,如果你发现 ObjectA 的另一个成员在这个方法中工作得更好,或者你想访问 ObjectA 的其他成员,你改变doSomething() 来体现这种变化,你还需要改变方法调用,为:

doSomethingRelatedToTheClass(myObject.getOtherValue(), myObject.getValue());

因此,通过传入整个对象,您可以抽象出该细节,而该方法可以处理它;即:

doSomethingRelatedToTheClass(myObject); // Doesn't need to know what you do with it.

public void doSomethingRelatedToTheClass(ObjectA object)
{
String val = object.getValue();

String otherVal = object.getOtherValue();
}

当对一个类的更改导致其他类的更改时,这是一种称为 Shotgun Surgery 的反模式.

编辑

我有机会在这里查看我的答案,并稍微修改了我的原始答案,因为我认为这不是所有情况的最佳解决方案。如上所述,如果一个方法与一个类具体相关,那么该类的实例化(或者更优选地,它的父类(super class)或实现的接口(interface)[s])应该是参数。

不是这种情况的时候是功能可以通用的时候。一个泛型函数的例子可能是:

public String[] findNouns(String sentence);

在这种情况下,在句子中查找名词可能适用于许多用例,而不仅仅是您定义的用例。因此,传入值是唯一明智的方法,因为否则,您会将两个没有直接关系的逻辑耦合在一起。找到名词和你定义的任意对象。

总结

  • 如果方法是与对象相关的逻辑,则传入对象

  • 如果方法与对象无关,而对象只是将其用作实用函数,则传入值并通用命名函数。

关于java - 传递整个对象与传递对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21136227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com