Объект доступа из лямбды передается в конструкторе объекта - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть класс Java MyClass с этим конструктором:

public MyClass(Consumer<?> someMethod)

И я хотел бы сделать это:

final MyClass myObject = new MyClass(obj -> { 
    doSomethingOutsideTheContextOfMyObject();
    myObject.doSmomething(obj);
    });

Но я получаю ошибку компилятора, что переменная myObject может небыть инициализированным.

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

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Я думаю, что лямбда, которую вы передаете своему Конструктору, не должна быть Потребителем;это должен быть BiConsumer ...

Примерно так:

import java.util.function.BiConsumer;

public class MyClass<T> {

    private BiConsumer<MyClass<T>, T> lambda;

    public MyClass(BiConsumer<MyClass<T>, T> lambda) {
        this.lambda = lambda;
    }

    private static void doSomethingOutside() {
        // TODO Auto-generated method stub

    }

    private void doSomething(T obj) {
        // TODO Auto-generated method stub

    }

    public void go(T o) {
        lambda.accept(this, o);
    }

    public static void main(String[] args) {
        MyClass<String> myObj = new MyClass<>((me, obj) -> {
            doSomethingOutside();
            me.doSomething(obj);
        });

        myObj.go("Hello World!");
    }
}

HTH!:)

0 голосов
/ 21 февраля 2019

Здесь:

final MyClass myObject

объявляет новый объект myObject.И затем вы продолжаете:

  = new MyClass(obj -> { 
  doSomethingOutsideTheContextOfMyObject();
  myObject.doSmomething(obj);

, используя то же самое myObject в своем собственном объявлении!

Это невозможно, как это!Вы создаете «самоссылку» круговыми способами!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...