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){...}
}
แต่ว่า 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();
}
}
ถ้าใครเขียน Python คงนึกออก เพราะเราต้องเวลาประกาศเมธอดก็ต้องมี explicit receiver( self ) เช่นกัน
ref:: https://blog.joda.org/2015/12/explicit-receiver-parameters.html
Top comments (0)