Di Java, apakah tipe enum di dalam kelas statis?

123

Sepertinya saya tidak dapat mengakses anggota instance dari kelas sekitar dari dalam enum, karena saya bisa dari dalam kelas dalam. Apakah itu berarti enum bersifat statis? Apakah ada akses ke cakupan instance kelas di sekitarnya, atau apakah saya harus meneruskan instance tersebut ke metode enum di mana saya membutuhkannya?

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;
    }
}
Hanno Fietz
sumber
Saya tidak yakin saya benar-benar mengerti apa yang Anda coba gambarkan. bisakah Anda memberikan contoh kode kecil mungkin?
Pete

Jawaban:

176

Ya, enum bersarang secara implisit statis.

Dari spesifikasi bahasa bagian 8.9 :

Jenis enum bertingkat secara implisit statis. Ini diizinkan untuk secara eksplisit mendeklarasikan jenis enum bersarang menjadi statis.

Jon Skeet
sumber
45

Tidaklah masuk akal untuk membuat kelas enum dalam tingkat instans (non-statis) - jika instans enum itu sendiri terikat ke kelas luar, mereka akan melanggar jaminan enum -

misalnya jika Anda punya

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

Agar nilai enum berfungsi dengan benar sebagai konstanta, (psuedocode, mengabaikan pembatasan akses)

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

b1 dan b2 harus menjadi objek yang sama.

Steve B.
sumber