2016-01-25 2 views
2

Я инициализирую объект, а в конструкторе я пропускаю лямбду. В лямбда мне хотелось бы получить доступ к объекту, который я инициализирую.Как получить доступ к «этому» из области параметров конструктора?

MyObject obj = new MyObject(params -> { 
    this.xyz(); //Tries to access scope of class surrounding obj 
    MyObject.this.xyz(); //Error: 'MyObject' is not a surrounding class 
    obj.xyz(); //Error: Variable 'obj' might not have been initialized. 
}); 

Пример MyObject Класс:

public class MyObject { 
    //Missing constructor 

    public void xyz(){ 
    //Do stuff 
    } 
} 

Я предпочел бы не пройти this к лямбда, если это возможно.

Если есть способ сделать «временную конечную переменную», я не могу ее найти.

+2

Выражение лямбда является объектом внутри, поэтому 'this' в любом случае не будет ссылаться на правильный объект внутри этого контекста, я думаю, вы должны передать его явно. – Jack

+0

Не имеет смысла обращаться к конструируемому объекту, пока он не будет полностью сконструирован, то есть после возврата конструктора. – EJP

+1

Почему вы не хотите использовать 'this'? Выражение лямбда не отменяет его, поэтому оно относится к окружающему MyObject. –

ответ

2

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

В этом случае вызов xyz() должен быть перенаправлен на объект, который еще не был инициализирован; Компилятор Java не может этого допускать.

Обходной путь для этого - убедить Java, что вы не собираетесь использовать частично инициализированный объект во время строительства. Вы можете сделать это первым построения объекта, и установка лямбда позже:

MyObject obj = new MyObject(); 
obj.setLambda(params -> { obj.xyz(); }); 

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

Смежные вопросы