DEV Community

Pramoth Suwanpech
Pramoth Suwanpech

Posted on

Explicit receiver parameter(this) in Java 8

Explicit receiver parameter เป็นฟีเจอร์ที่มาใหม่ตั้งแต่ Java 8 ไม่ค่อยได้ใช้ บางครั้งก็ลืมกันไปเลยว่ามี วันนี้เรามา Note ไว้ซะหน่อย

ปกติแล้วเวลาเราเรียกเมธอดที่เป็น instance method (ที่ไม่ใช่ static) จาวาคอมไพล์เลอร์จะใส่ implicit receive parameter ที่ตำแหน่ง 0 ที่หมายถึง instance ของ object(แทนด้วย this)

เช่น ถ้ามีเมธอด int getAge() เวลาคอมไพล์ออกมาจะได้ getAge(Person p) เพื่อที่จะได้เรียกเมธอด getAge() ใน context ของ object ใดๆโดยคอมไพเลอร์จัดการให้และไม่ยอมให้เราใส่เอง

class Person{
int getAge(){..}

\\คอมไพล์แล้วจะได้แบบนี้นะ(ใน bytecode อยู่ลำดับแรกของพารามิเตอร์)
int getAge(Person p){...}
}
Enter fullscreen mode Exit fullscreen mode

แต่ว่า Java 8 เพิ่มฟีเจอร์ใหม่มาทำให้เราสามารถประกาศเมธอดที่มี receive parameter ได้ (แต่ตอน call method จะระบุไม่ได้เหมือนเดิม)
สาเหตที่เพิ่มมาเพราะเพื่อให้เราเพิ่ม annotation เข้าไปตรง receiver parameter ได้

โดยเราสามารถ reflection เอา annotaion ได้จาก Method.getAnnotatedReceiverType()

class Person {
    int age;

    public int getAge(@MyAnnotation Person this) {
        return this.age;
    }

    public void setAge(Person this, int age) {
        this.age = age;
    }
}

public class App {
    public static void main(String[] args) {
        Person p = new Person();
        p.setAge(10);
        p.getAge();
    }
}

Enter fullscreen mode Exit fullscreen mode

ถ้าใครเขียน Python คงนึกออก เพราะเราต้องเวลาประกาศเมธอดก็ต้องมี explicit receiver( self ) เช่นกัน

ref:: https://blog.joda.org/2015/12/explicit-receiver-parameters.html

Top comments (0)