2

我有一个编码困境,我不知道是否有处理它的模式或实践。每当我必须将一些值传递给方法时,大多数时候我会尝试仅传递所需的对象,而不是传递由它们组成的对象。我正在和一位朋友讨论 Java 如何管理堆和内存的东西,但我们一无所获。

让我举两个例子:

//Example 1:
private void method doSomething(String s, Car car, boolean isReal){...}
...
String s        = myBigObject.getLabels.getMainName();
Car car         = myBigObject.getCar();
boolean isReal  = myBigObject.isRealCar();

doSomething(s, car, isReal);

//Example 2 - having in mind that BigObject is a really big object and I'll only use those 3 atributes:
private void method doSomething(BigObject bigObject){...}
...

doSomething(myBigObject);

在第二个例子中,在我看来内存会被浪费,传递一个大对象而不需要它。

4

4 回答 4

3

由于 Java 仅传递对对象的引用(并复制它们,使其在技术上按值传递),因此传递“大对象”没有内存开销。您的示例 1 实际上使用了更多内存。

但是,这样做可能仍然有充分的理由:它删除了依赖项并允许您调用doSomething属于. BigObject这可能是也可能不是优势。如果它被大量调用BigObject参数,你会有很多重复的代码来提取这些值,这不是很好。

另请注意,您不必将返回值分配给局部变量来传递它们。你也可以这样做:

doSomething(myBigObject.getLabels().getMainName(), 
            myBigObject.getCar(), 
            myBigObject.isRealCar());
于 2013-04-26T23:15:59.917 回答
1

All references are the same size, so how could it use more memory? It doesn't.

于 2013-04-26T23:23:07.050 回答
1

Java 使用按值传递,当我们将对象传递给方法时,请记住,我们不会传递存储在对象内部的所有值,我们只是传递位(类似于 ab06789c),这是对象存储在内存中的地址(堆内存)。所以你在第一种情况而不是第二种情况下浪费了更多的内存。
参考 JAVA pass-by-reference 或 pass-by-memory

于 2013-04-26T23:00:44.850 回答
1

您已经只传递了对 的引用BigObject而不是 的完整副本BigObject。Java 按值传递引用。

可以说,第一种方式花费的内存更多,而不是更少,因为您现在传递两个引用和 aboolean而不是单个引用。

于 2013-04-26T22:44:31.800 回答