การเริ่มต้นตัวแปรขั้นสุดท้าย [ซ้ำกัน]

ฉันมีตัวแปร final สองตัวที่ประกาศในระดับคลาส แต่ตัวแปรเหล่านั้นไม่ได้เตรียมใช้งาน
ดังนั้น เมื่อฉันพยายามสร้างคอนสตรัคเตอร์เริ่มต้นสำหรับคลาสนั้น มันแสดงข้อผิดพลาดว่า
The blank final field may not have been initialized

เหตุใดข้อผิดพลาดนี้จึงเกิดขึ้น เหตุใดจึงต้องเริ่มต้นตัวแปรสุดท้ายในตัวสร้าง?

ฉันมีคำถามอื่นอีก นั่นคือ เป็นไปไม่ได้ที่จะสร้างอินสแตนซ์โดยไม่มีตัวสร้างเริ่มต้นหรือไม่ แม้ว่าเราจะมีตัวสร้างพารามิเตอร์ก็ตาม


person Saikiran Gosikonda    schedule 26.02.2016    source แหล่งที่มา
comment
อ้างอิง stackoverflow.com/questions/26935453/   -  person sasikumar    schedule 26.02.2016
comment
คุณต้องเริ่มต้นฟิลด์สุดท้ายด้วยตัวสร้างเสมอ ต้องกำหนดฟิลด์สุดท้ายระหว่างการสร้างออบเจ็กต์ โดยไม่คำนึงถึงตัวสร้าง - ทุกฟิลด์สุดท้ายจะต้องมีค่าที่กำหนด   -  person mlewandowski    schedule 26.02.2016
comment
@mlewandowski คุณไม่จำเป็นต้องทำด้วยตัวสร้าง - คุณสามารถกำหนดค่าฟิลด์ได้โดยตรงหรือใช้บล็อกเริ่มต้น (ซึ่งโดยพื้นฐานแล้วเทียบเท่ากัน)   -  person Andy Turner    schedule 26.02.2016


คำตอบ (2)


เหตุใดจึงต้องเริ่มต้นตัวแปรสุดท้ายในตัวสร้าง?

ต้องเริ่มต้นฟิลด์ final ในตัวสร้าง เนื่องจากนี่คือความหมายของ final

คุณไม่จำเป็นต้องตั้งค่า final feilds ในตัวสร้างเริ่มต้นหากคุณเรียกตัวสร้างซึ่งทำเช่น

class A {
   final int a;

   public A() {
       this(0);
   }

   public A(int a) {
       this.a = a;
   }
}

เป็นไปไม่ได้ที่จะสร้างอินสแตนซ์โดยไม่มีตัวสร้างเริ่มต้นหรือไม่

ใช่. มีหลายวิธีในการทำเช่นนี้ โดยส่วนใหญ่มักจะเรียกตัวสร้างซึ่งรับพารามิเตอร์

แม้ว่าเราจะมีตัวสร้างพารามิเตอร์ก็ตาม

ในกรณีนี้ คุณจะมีเพียง Constructor ที่ไม่รับพารามิเตอร์ใดๆ หากคุณกำหนดไว้

person Peter Lawrey    schedule 26.02.2016

Final variable คือตัวแปรเหล่านั้น which can not be changed once object is initialized. ดังนั้นคุณจะต้องเริ่มต้นตัวแปรสุดท้ายอย่างไร หากคุณกำลังจัดเตรียมตัวสร้างเริ่มต้นและตัวสร้างแบบพารามิเตอร์ คุณต้องเตรียมใช้งานตัวแปรเหล่านั้น เนื่องจากคุณไม่สามารถเปลี่ยนค่าได้ในภายหลัง

person Rahul    schedule 26.02.2016