Java 返回新对象或设置传递对象的变量

Java 返回新对象或设置传递对象的变量,java,android,Java,Android,我正在阅读,想知道是否有特别的原因让方法用数据填充预先存在的数组或对象,而不是返回对象或数据的实例 在某些情况下,例如图形,它只允许重新使用对象重写原语,而无需在每次调用时分配另一个对象 还有其他我没有考虑的好处吗?考虑以下简单的方法,它用几个数字填充整数数组: public void fillArray(int[] array) { array[0] = 0; array[1] = 1; array[2] = 2; } // now use it int[] arra

我正在阅读,想知道是否有特别的原因让方法用数据填充预先存在的数组或对象,而不是返回对象或数据的实例

在某些情况下,例如图形,它只允许重新使用对象重写原语,而无需在每次调用时分配另一个对象


还有其他我没有考虑的好处吗?

考虑以下简单的方法,它用几个数字填充整数数组:

public void fillArray(int[] array) {
    array[0] = 0;
    array[1] = 1;
    array[2] = 2;
}

// now use it
int[] array = new array[3];
fillArray(array);
当fillArray方法用一些值填充数组时,它正在寻址调用方传入的实际数组。调用方保留对其数组的引用,因此无需将引用传递回数据。请注意,我们可以将fillArray的签名更改为int[],并返回对该数组的引用,但从功能上讲,这并没有多大区别

返回int[]可能有意义的地方是,如果我们想要创建一个为数组分配空间然后返回结果的方法,例如

public int[] getArray() {
    int[] array = new int[3];
    array[0] = 0;
    array[1] = 1;
    array[2] = 2;
    return array;
}

在这种情况下,调用者没有/不想接触数组的工作,他只想要最终产品。因此,返回对数组的引用是有意义的,如果没有它,调用方将无法使用该方法生成的数据。

请考虑以下简单的方法,该方法用几个数字填充整数数组:

public void fillArray(int[] array) {
    array[0] = 0;
    array[1] = 1;
    array[2] = 2;
}

// now use it
int[] array = new array[3];
fillArray(array);
当fillArray方法用一些值填充数组时,它正在寻址调用方传入的实际数组。调用方保留对其数组的引用,因此无需将引用传递回数据。请注意,我们可以将fillArray的签名更改为int[],并返回对该数组的引用,但从功能上讲,这并没有多大区别

返回int[]可能有意义的地方是,如果我们想要创建一个为数组分配空间然后返回结果的方法,例如

public int[] getArray() {
    int[] array = new int[3];
    array[0] = 0;
    array[1] = 1;
    array[2] = 2;
    return array;
}

在这种情况下,调用者没有/不想接触数组的工作,他只想要最终产品。因此,返回对数组的引用是有意义的,如果没有它,调用者将无法使用该方法生成的数据。

我理解您的疑问。MemoryInfo和getMemoryInfo的设计允许您创建任意数量的MemoryInfo对象,但是如果它们都是正确的,它们应该都包含相同的数据,因此这样做没有实际意义。更清晰的设计将为您提供四个getter,它们将返回四个值

我认为选择这种设计的一个原因是效率:它允许您在每次调用时将相同的对象传递给方法,并且它在一次调用中提供所有信息,而不是四次调用。不过,我在这里猜测


一般来说,当选择一个设计时,有更多的事情要考虑。例如,如果一个方法要向您提供关于某人的一些信息,我会发现传递一个person对象以供该方法修改是很自然的,而不是每次调用该方法时返回一个表示同一个人的新person对象。或者至少每次它都应该给你相同的对象,只有当你询问一个新的人时才会给你一个新的对象。

我理解你为什么这么想。MemoryInfo和getMemoryInfo的设计允许您创建任意数量的MemoryInfo对象,但是如果它们都是正确的,它们应该都包含相同的数据,因此这样做没有实际意义。更清晰的设计将为您提供四个getter,它们将返回四个值

我认为选择这种设计的一个原因是效率:它允许您在每次调用时将相同的对象传递给方法,并且它在一次调用中提供所有信息,而不是四次调用。不过,我在这里猜测

一般来说,当选择一个设计时,有更多的事情要考虑。例如,如果一个方法要向您提供关于某人的一些信息,我会发现传递一个person对象以供该方法修改是很自然的,而不是每次调用该方法时返回一个表示同一个人的新person对象。或者至少每次它应该给你相同的对象,只有当你询问一个新的人时才给你一个新的对象

我正在读这篇文章,想知道是否有特别的原因 用于使用方法填充预先存在的数组或对象 数据,而不是返回对象或数据的实例

这是两种可供选择的方法。 提供一个对象作为方法的参数进行填充,当然还有其他优点:

1您希望为该方法提供一个对象,该对象的状态由客户端定义,而不是在调用的方法中定义的泛型或原始状态。 如果不将其实例作为参数传递,则无法执行此操作

2您想节省内存消耗。如果你已经有了一个对象 ss它作为参数,为什么要在调用的方法中创建一个新的参数

3方法中有多个要赋值的对象,但一个方法只能返回一个对象

假设您希望在实现中填充3个列表

例如,您可以调用poupulateListmyList、myOtherList、myAgainOtherList

通过这种实施:

public void populateList(List<String> list, List<String> myOtherList, List<String> myAgainOtherList){
       ....
}
如果不将对象作为参数传递,则必须引入包含所有这些对象的自定义类,并将其定义为方法的返回类型

我正在读这篇文章,想知道是否有特别的原因 用于使用方法填充预先存在的数组或对象 数据,而不是返回对象或数据的实例

这是两种可供选择的方法。 提供一个对象作为方法的参数进行填充,当然还有其他优点:

1您希望为该方法提供一个对象,该对象的状态由客户端定义,而不是在调用的方法中定义的泛型或原始状态。 如果不将其实例作为参数传递,则无法执行此操作

2您想节省内存消耗。如果已经有一个对象作为参数传递,为什么要在调用的方法中创建一个新的对象

3方法中有多个要赋值的对象,但一个方法只能返回一个对象

假设您希望在实现中填充3个列表

例如,您可以调用poupulateListmyList、myOtherList、myAgainOtherList

通过这种实施:

public void populateList(List<String> list, List<String> myOtherList, List<String> myAgainOtherList){
       ....
}

如果不将对象作为参数传递,您将被迫引入一个包含所有这些对象的自定义类,并将其定义为方法的返回类型。

我不确定是否理解引用的问题与您的问题之间的关系。唯一的关系是方法的样式。ActivityManager.getMemoryInfo接受一个只包含4个变量的MemoryInfo对象,并用内存信息填充它,而不是返回一个新的MemoryInfo对象。我明白了。谢谢。我不确定参考问题和你的问题之间的关系。唯一的关系是方法的风格。ActivityManager.getMemoryInfo接受一个只包含4个变量的MemoryInfo对象,并用内存信息填充它,而不是返回一个新的MemoryInfo对象。我明白了。谢谢。我理解修改对象内容的函数的用法,例如Arrays.fill,我不完全理解的情况是修改内容的方法充当getter。查看哪个有效地获取视图位置的值,但修改现有数组的内容,而不是返回一个。@ThePearson Bray您指的确切方法是什么?屏幕上的GetLocation应该在链接中。它用x和y位置填充int数组。@TheoPearson-Bray这种方法似乎完全符合我答案中的描述。用户有一个二维数组,然后使用getLocationOnScreen方法填充该数组。关于视图内部实际存储的内容,这并不重要。如果你真的好奇的话,我们可以看看源代码。我意识到方法的上下文并不重要,它只是一个例子。假设我正在编写一个类,该类的用户需要从中访问一些信息。在哪种情况下,我将编写一个getter,在哪种情况下我将编写一个方法来填充现有的数据结构?为什么不两个都写呢?这只是一个基于类用户访问数据的方式和频率的选择吗?我理解修改对象内容的函数的用法,例如Arrays.fill,我不完全理解的情况是修改内容的方法充当getter。查看哪个有效地获取视图位置的值,但修改现有数组的内容,而不是返回一个。@ThePearson Bray您指的确切方法是什么?屏幕上的GetLocation应该在链接中。它用x和y位置填充int数组。@TheoPearson-Bray这种方法似乎完全符合我答案中的描述。用户有一个二维数组,然后使用getLocationOnScreen方法填充该数组。关于视图内部实际存储的内容,这并不重要。如果你真的好奇的话,我们可以看看源代码。我意识到方法的上下文并不重要,它只是一个例子。假设我正在编写一个类,该类的用户需要从中访问一些信息。在哪种情况下,我将编写一个getter,在哪种情况下我将编写一个方法来填充现有的数据结构?为什么不两个都写呢?这仅仅是基于类用户访问数据的方式和频率的选择吗?