我计划在Java中实现一个破坏性的串联函数,如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 的地址传递给参数?
你的理解是正确的。您可以通过将A
初始化为空列表而不是 null
来解决此问题。这也将避免 NPE 并减少对!= null
检查的需求。
我建议你将 dcatenate() 的参数更改为
list = dcatenate(list);
其中列表包含 IntList A 和 B。
这样,您可以保持引用不变。
我不认为这是一种限制。这只是其中一种方法。
将空引用更改为对象实例。A
的值甚至可能根本不是一个变量——也许调用代码看起来像:
dcatenate(getListA(), getListB());
在这种情况下,dcatenate
实际上无法将新的对象实例传达回其调用方。
在这种特殊情况下,听起来dcatenate
函数的先决条件是A
参数必须是可变列表。 null
不是一个可变列表,因此dcatenate
应该抛出异常(可能是IllegalArgumentException
或NullPointerException
)。
出于您提到的原因,我建议您的dcatenate
方法返回一个新列表,而不是尝试直接修改参数。然后,如果需要,您可以简单地将结果分配回A
。
例:
IntList A = null;
IntList B = new IntList(4,5,6); // B: 4->5->6
A = dcatenate(A, B);