按值传递 是设计使然:f(x) 可能会改变 x 值的内部结构,但 x 不会获得另一个值。 _例如,您不能使用 f 的形式参数将 null 分配给 f 内部的 x。
in-out parameters有可能在java中可以通过函数的结果来完成:
insertInNodes就是这样一种方法。
public class SortedLinkedList<T extends Comparable<T>> {
private static class Node { ... }
Node head;
int size;
public void insert(T data) {
head = insertInNodes(head, data);
}
private Node insertInNodes(Node node, T data) {
if (node == null || data.compareTo(node.data) < 0) {
++size;
return new Node(data, node);
}
if (data.compareTo(node.data) > 0) {
node.next = insertInNodes(node.next, data);
}
return node;
}
}
传递引用需要伪造它:传递一个容器对象,然后组件实际上是一个引用。例如具有一个元素的数组或包装类,如Atomic<String>。
通过引用传递可以通过传递所需“变量”的getter和setter来实现。
public void insert(T data) {
insertInNodes(this::getHead, this::setHead, data);
// Or insertInNodes(() -> head, (n) -> head = n, data);
}
private void insertInNodes(Supplier<Node> getter, Consumer<Node> setter, T data) {
if (getter.get() == null || data.compareTo(getter.get().data) < 0) {
++size;
setter.apply(new Node(data, getter.get()));
}
if (data.compareTo(node.data) > 0) {
// insertInNodes(() -> node.next, (n) -> node.next = n, data);
// or
insertInNodes(node::setNext, node::getNext, data);
}
return node;
}
这个有用吗?不,仅在特定用例中。