我计划在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的地址传递给参数?
答案 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);