2014-12-31 2 views
1

Я читаю «Мышление в Java» и в пункте, где объясняется this ключевое слово, использование автора ниже примереКак понять, какой метод возвращается, когда «вернуть этот» используется

public class Leaf { 
    int i = 0; 
    Leaf increment() { 
     i++; 
     return this; 
    } 
    void print() { 
     System.out.println("i = " + i); 
    } 
    public static void main(String[] args) { 
     Leaf x = new Leaf(); 
     x.increment().increment().increment().print(); 
    } 
} 

Что интересно, это , как понять, что возвращает метод increment()? Автор объясняет, что он возвращает ссылку на текущий объект. Означает ли это, что заявление x.increment() возвращает вид x (я знаю, какая ссылка означает)? И начальная заявка x.increment().increment().increment().print(); после выполнения первых x.increment(), стала x.increment().increment().print();?

Это звучит логично для меня, но я не уверен, правильно ли я это понимаю.

+2

Он возвращает этот текущий экземпляр. Когда вы создаете объект и вызываете этот метод из него, он возвращает объект, из которого вы вызываете метод, из которого вы можете вызвать больше методов. Fn. –

+0

Помните, что «текущий объект» может быть подклассом «Лист». Таким образом, в этом случае он возвращает «Лист», но в целом он возвращает «Лиф» или подкласс «Листа» (обратите внимание, что «Лист» не является «финальным» классом). – markspace

+0

http://en.wikipedia.org/wiki/Method_chaining – Sirko

ответ

1

Метод подпись increment() является

Leaf increment() 

, который говорит, что он возвращает Leaf экземпляра.

return this означает возврат экземпляра класса Leaf, который вызывается (который в вашем случае называется x).

x.increment().increment().increment().print(); 

такая же, как

x.increment(); 
x.increment(); 
x.increment(); 
x.print(); 
2

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

Отличным примером из JDK является StringBuilder. Например, нет ничего плохого в этом коде:

StringBuilder builder = new StringBuilder(); 
builder.append("welcome"); 
builder.append("to"); 
builder.append("StackOverflow"); 

Но разве это не выглядит лучше?

StringBuilder builder = new StringBuilder().append("welcome").append("to").append("StackOverflow"); 
+0

Он будет выглядеть лучше всего как одно заявление с разрывами строк, на мой взгляд. –

+1

Славный ресурс о [цепочке методов] (https://en.wikipedia.org/wiki/Method_chaining) можно найти здесь [http://www.drdobbs.com/jvm/creating-and-destroying-java -Объекты-пар/208403883? PGNO = 2). – Daniel

+0

@ Даниэль - спасибо за ссылку. Я читал его, и это звучит для меня, насколько я понимаю, но я еще не знаю, как технически назвать его – FlenMK

1

Вы можете визуализировать this как скрытый параметр, который содержит ссылку на экземпляр, на котором выполняется метод. Чтобы узнать, что содержит this, вы должны посмотреть, что находится слева от точки, отделяющей метод от экземпляра.

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