ใน Java ประเภท enum อยู่ในคลาสคงที่หรือไม่


123

ดูเหมือนว่าฉันจะไม่สามารถเข้าถึงสมาชิกอินสแตนซ์ของคลาสโดยรอบจากภายใน enum ได้อย่างที่ฉันทำได้จากภายในคลาสภายใน หมายความว่า enums คงที่หรือไม่? มีการเข้าถึงขอบเขตของอินสแตนซ์ของคลาสโดยรอบหรือไม่หรือฉันต้องส่งอินสแตนซ์ไปยังเมธอดของ enum ที่ฉันต้องการ?

public class Universe {
    public final int theAnswer;

    public enum Planet {
        // ...
        EARTH(...);
        // ...

        // ... constructor etc.

        public int deepThought() {
            // -> "No enclosing instance of type 'Universe' is accessible in this scope"
            return Universe.this.theAnswer;
        }
    }

    public Universe(int locallyUniversalAnswer) {
        this.theAnswer = locallyUniversalAnswer;
    }
}

ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณพยายามอธิบายทั้งหมด คุณสามารถให้ตัวอย่างโค้ดเล็ก ๆ ได้หรือไม่?
พีท

คำตอบ:


176

ใช่ enums ที่ซ้อนกันเป็นแบบคงที่โดยปริยาย

จากข้อกำหนดภาษาส่วน 8.9 :

ประเภท enum ที่ซ้อนกันเป็นแบบคงที่โดยปริยาย อนุญาตให้ประกาศประเภท enum ที่ซ้อนกันเป็นแบบคงที่ได้อย่างชัดเจน


45

มันไม่สมเหตุสมผลที่จะสร้างคลาส enum ระดับอินสแตนซ์ (ไม่คงที่) - ถ้าอินสแตนซ์ enum ผูกติดอยู่กับคลาสด้านนอกพวกเขาจะทำลายการรับประกัน enum -

เช่นถ้าคุณมี

public class Foo {
   private enum Bar {
        A, B, C;
   } 
}

เพื่อให้ค่า enum ทำหน้าที่เป็นค่าคงที่อย่างถูกต้อง (psuedocode, ละเว้นข้อ จำกัด การเข้าถึง)

Bar b1 = new Foo().A
Bar b2 = new Foo().A

b1 และ b2 จะต้องเป็นวัตถุเดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.