Как реализовать передачу по ссылке в явном виде в Java? - PullRequest
0 голосов
/ 25 октября 2018

Я знаю, что Java не поддерживает передачу по ссылке.Но все же есть ли возможность реализовать его другими способами, если не напрямую, как в C / C ++?

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Если , что вы пытаетесь сделать, это иметь "ссылку" на примитивное значение, которое вы можете передать, чтобы вы могли изменить значение примитива внутри методов ичтобы изменения были видны за пределами указанных методов ...

... просто передайте массив, содержащий примитив, как здесь:

// By value
int value = 1;
changeValue(value); // changes value to 5
System.out.println(value); // prints 1

// By "reference"
int[] reference = {1};
changeValue(reference); // changes value inside "reference" to 5
System.out.println(reference[0]); // prints 5

// Methods
void changeValue(int value) { value = 5; }
void changeValue(int[] reference) { reference[0] = 5; }

Имейте в виду, что это не "проход мимоссылка".Java не передает ссылку на значение, Java передает значение ссылки на массив.
Вы можете прочитать Является ли Java "передачей по ссылке" или "передачей по значению"? для лучшего обсуждения этого.

0 голосов
/ 25 октября 2018

Передача по значению была задуманна: 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;
    }

Можно ли это использовать?Нет, только в определенных случаях использования.

0 голосов
/ 25 октября 2018

Неа.Вы не можете сделать это.Это не то, что вы можете «реализовать».Это фундаментальный аспект языка.

...