将null传递给Java中的破坏性方法

时间:2016-05-27 15:03:32

标签: java parameters null

我计划在Java中实现破坏性的catenation函数,如public static void dcatenate(IntList A, IntList B),用于将列表B附加到A,并且应修改原始A.例如,

IntList A = new IntList(1,2,3); // A: 1->2->3
IntList B = new IntList(4,5,6); // B: 4->5->6
dcatenate(A, B) // A: 1->2->3->4->5->6

然而,如果A=null怎么办?

IntList A = null;
IntList B = new IntList(4,5,6); // B: 4->5->6
dcatenate(A, B) // A: 4->5->6 (is it possible?)

由于函数参数是按值传递的,因此当我将null传递给参数时,我无法在函数中找到原始的A.此外,修改参数A将永远不会更改原始A,因为它们都存储在不同的地址中,尽管它们都是空的。我的理解是否正确?如果是这样,我该如何解决这个问题呢?是否可以像C / C ++一样将原始A的地址传递给参数?

4 个答案:

答案 0 :(得分:1)

我建议您将dcatenate()的参数更改为

list = dcatenate(list); 

其中列表包含IntList A和B.

这样您就可以保持参考不变。

我不认为这是一种限制。这只是其中一种方法。

答案 1 :(得分:1)

您的理解是正确的。您可以通过将A初始化为空列表而不是null来解决此问题。这也将避免NPE并减少!= null检查的需要。

答案 2 :(得分:0)

无法将空引用更改为对象实例。 A的值甚至可能根本不是变量 - 也许调用代码看起来像:

dcatenate(getListA(), getListB());

在这种情况下,dcatenate几乎无法将新的对象实例传回给其调用者。

在这种特殊情况下,听起来dcatenate函数的前提条件是A参数必须是可变列表。 null不是可变列表,因此dcatenate应该抛出异常(可能是IllegalArgumentException或可能是NullPointerException)。

答案 3 :(得分:0)

我建议您使用dcatenate方法返回一个新列表,而不是尝试直接修改参数,原因如上所述。然后,如果需要,您可以简单地将结果分配回A

示例:

IntList A = null;
IntList B = new IntList(4,5,6); // B: 4->5->6
A = dcatenate(A, B);