Почему я не могу присвоить значение для ссылки на объект, возвращаемой методом? - PullRequest
0 голосов
/ 14 октября 2019

У меня есть функция, которая возвращает ссылку на объект. Почему я не могу назначить эту возвращенную ссылку для указания на другой объект? Ссылка, возвращаемая функцией, не является окончательной, поэтому мне следует разрешить изменить ее значение, чтобы оно указывало на другой объект.

class TestClass3 {
    public TestClass3 hello() {
        TestClass3 t = new TestClass3();
        return t;
    }
}

class TestClass1 {
    public static void main(String[] args) {
        TestClass3 obj = new TestClass3();

        // The below line of code gives an error
        obj.hello() = null; 
    }
}

Я ожидаю, что ссылка, возвращаемая при вызове метода hello (), должна бытьприсвоенное нулевое значение.

Ответы [ 5 ]

1 голос
/ 14 октября 2019

Вам нужно будет присвоить obj.hello() переменной, которую затем вы можете установить на null, если хотите.

0 голосов
/ 14 октября 2019

obj.hello () - это поведение объекта , не ссылка, только ссылка может быть установлена ​​на ноль.

О нуле:

  • null - это просто ссылочное значение .
  • ссылка - это переменная с именеми может использоваться для доступа к объекту путем обращения к адресу памяти, в котором он расположен.

Об объекте:

Всеобъекты имеют три существенные особенности:

  • состояние
  • поведение
  • личность
0 голосов
/ 14 октября 2019

Проще говоря, это потому, что Java не позволяет этого, в то время как есть языки, которые делают (например, Python). В Java вы не можете monkey-patch существующий код.

Почему? Ну, Java не была рождена как функциональный язык, поэтому, хотя в Java 8 было добавлено большое количество ссылок на функции, они все еще не первоклассные граждане. Таким образом, вы не можете присвоить новое значение методу класса, как вы можете с полем этого класса.

Однако, поскольку вы можете присваивать значения полям, вы можете сделать что-то вроде этого:

class TestClass3 {

    public Supplier<TestClass3> hello;

    public TestClass3() {
        this.hello = this::hello;
    }

    public TestClass3 hello() {
        TestClass3 t = new TestClass3();
        return t;
    }
}

class TestClass1 {
    public static void main(String[] args) {
        TestClass3 obj = new TestClass3();
        obj.hello.get(); // calls hello()
        obj.hello = null; // now works
    }
}

Здесь я определяю члена с именем hello в TestClass3. Это тип Supplier<TestClass3>, и так уж получилось, что public TestClass3 hello() того же типа. Следовательно, в конструкторе TestClass3 я могу сделать это: this.hello = this::hello;.

Теперь у нас есть ссылка на hello() как поле , что означает, что мы можем вызватьиспользовать это поле или даже изменить значение поля:

obj.hello.get();
obj.hello = null;
0 голосов
/ 14 октября 2019

Здесь, в вашем коде, когда вы пишете obj.hello(), он вызывает только метод hello. Он не присваивает возврат hello какой-либо переменной. Таким образом, ни одна переменная не содержит возвращаемого значения метода hello. Пока вы можете присвоить нулевое значение той же переменной. Вот почему это недопустимый синтаксис.

Допустимый синтаксис должен быть таким:

TestClass3 value = obj.hello();
value = null;
0 голосов
/ 14 октября 2019

Вы пытаетесь установить метод в значение, это невозможно и не имеет никакого смысла, если вы об этом думаете. Если вы хотите сохранить ссылку, возвращаемую obj.hello(), напишите

TestClass3 obj2 = obj.hello();
...