เมื่อประกาศตัวแปรเป็น final หลังจากกำหนดค่าแล้วจะแก้ไขไม่ได้ ต่างจาก instance variable ทั่วไป final variable ไม่มีค่า default จึง บังคับต้องกำหนดค่าตอนประกาศหรือใน constructor มิฉะนั้นจะเกิด compile-time error
ตัวอย่าง error: ไม่ได้กำหนดค่า
public class FinalExample {
final int j; // Error: variable j might not have been initialized
public static void main(String[] args){
FinalExample obj = new FinalExample();
System.out.println(obj.j);
}
}
4 วิธีในการกำหนดค่า final variable
1. ตอนประกาศ (Inline Initialization)
public class FinalExample {
final int j = 100;
public static void main(String[] args){
System.out.println(new FinalExample().j); // 100
}
}
2. ใช้ final method
import java.util.Scanner;
public class FinalExample {
final int num = getNum();
public static final int getNum() {
System.out.println("Enter the num value");
return new Scanner(System.in).nextInt();
}
public static void main(String[] args){
System.out.println(new FinalExample().num);
}
}
3. ใช้ Constructor (พบบ่อยที่สุด)
public class FinalExample {
final int num;
public FinalExample(int num) {
this.num = num; // ต้องกำหนดค่าในทุก constructor
}
public static void main(String[] args){
System.out.println(new FinalExample(20).num); // 20
}
}
4. ใช้ Instance Initialization Block
public class FinalExample {
final int num;
{ // Instance initializer block
num = 500;
}
public static void main(String[] args){
System.out.println(new FinalExample().num); // 500
}
}
ข้อสังเกตสำคัญ
- final instance variable ต้องถูกกำหนดค่าใน ทุก constructor ของคลาส
- final static variable ต้องกำหนดค่าตอนประกาศ หรือใน static initializer block
- การใช้ constructor เป็นวิธีมาตรฐานและยืดหยุ่นที่สุด สามารถรับค่าจากภายนอกได้
สรุป
ได้ ตัวแปร final สามารถกำหนดค่าเมื่อสร้างออบเจ็กต์ผ่าน constructor (หรือ instance initializer block) ซึ่งเป็นวิธีที่พบบ่อยและแนะนำมากที่สุด