Передача по значению была задуманна: f(x)
может изменить внутреннее значение значения x, но x не получит другое значение._ Например, вы не можете присвоить null x внутри f, используя формальный параметр f.
Существует возможность параметров ввода-вывода , которые в 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;
}
}
Передача по ссылке необходимо либо fake it: передать объект контейнераа затем компонент на самом деле является ссылкой .Например, массив с одним элементом или класс-оболочка, такой как Atomic<String>
.
Передача по ссылке в более чистой форме, может быть реализован путем передачи метода получения и установки требуемого«переменная».
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;
}
Можно ли это использовать?Нет, только в определенных случаях использования.