Java: menggunakan pernyataan switch dengan enum di bawah subclass

265

Pertama saya akan menyatakan bahwa saya jauh lebih akrab dengan enum di C # dan sepertinya enum di java sangat berantakan.

Seperti yang Anda lihat, saya mencoba menggunakan pernyataan switch @ enums dalam contoh saya berikutnya tetapi saya selalu mendapatkan kesalahan tidak peduli apa yang saya lakukan.

Kesalahan yang saya terima adalah:

Label kasus yang memenuhi syarat SomeClass.AnotherClass.MyEnum.VALUE_Aharus diganti dengan konstanta enum yang tidak berkualitasVALUE_A

Masalahnya adalah saya cukup mengerti kesalahannya tetapi saya tidak bisa menulis VALUE_A karena enum terletak di sub-kelas lain. Apakah ada cara untuk menyelesaikan masalah ini? Dan mengapa itu terjadi di Jawa?

//Main Class
public class SomeClass {

    //Sub-Class
    public static class AnotherClass {
        public enum MyEnum {
            VALUE_A, VALUE_B
        }    
        public MyEnum myEnum;
    }

    public void someMethod() { 
        MyEnum enumExample //...

        switch (enumExample) {
            case AnotherClass.MyEnum.VALUE_A: { <-- error on this line
                //..
                break;
            }
        }
    }
}
Popokoko
sumber
Sebagai darrengorman berkomentar, Jawa Enumadalah sangat berguna sekali Anda mendapatkan memahamkan mereka - sama sekali tidak berantakan. Mereka jauh lebih fleksibel dan praktis daripada enum sederhana (hanya nilai integer berlabel) seperti yang terlihat pada platform lain. Lihat Tutorial Oracle . Temukan optimasi Set/ Mapimplementasi: EnumSet& EnumMap.
Basil Bourque
1
Ketika Anda mencoba untuk memenuhi syarat pernyataan kasus; dengan kata lain, Anda mencoba mengatakan bahwa saya dapat mencampur berbagai jenis enum (bukan hanya jenis enum yang sama) dalam satu pernyataan sakelar. Java telah menghentikannya dengan pendekatan ini seperti yang dibahas di sini digizol.com/2010/10/enum-case-label-switch-java-qualified.html
lkamal
Ini terjadi pada saya saat refactoring (memindahkan) kelas di IntelliJ 2018.2
Daniel Alder

Jawaban:

570

Ubah ke ini:

switch (enumExample) {
    case VALUE_A: {
        //..
        break;
    }
}

Petunjuknya ada dalam kesalahan. Anda tidak perlu memenuhi syarat caselabel dengan jenis enum, hanya nilainya.

darrengorman
sumber
20
Ok saya merasa sangat bodoh :-( Anda benar sekali, saya yakin saya mencoba garis yang tepat ini dan mendapat kesalahan dengan itu jadi saya pindah ke kasus yang memenuhi syarat, tetapi saran Anda TIDAK berfungsi.
Popokoko
4
Ngomong-ngomong saya pikir Anda akan menemukan bahwa enum di Jawa sangat berguna setelah Anda mulai menggunakannya lebih banyak, saya tidak akan mengatakan mereka berantakan sama sekali :)
darrengorman
11
@milkplusvellocet, saya tahu posting ini sudah tua, tapi saya ingin tahu mengapa Java tidak mengizinkan label kasus yang memenuhi syarat dalam pernyataan switch?
jzarsuelo
3
@ cRane01 tidak tahu pasti, tetapi itu membuat sintaksis lebih bersih. Menentukan jenis pada setiap kasus akan benar-benar berlebihan
darrengorman
3
@ HaloGoodbye Tidak. Variabel pernyataan beralih mendefinisikan jenis pernyataan kasus sehingga hanya bisa satu enum.
sprinter
33

Java menyimpulkan secara otomatis jenis elemen dalam case, sehingga label harus tidak memenuhi syarat.

int i;
switch(i) {
   case 5: // <- integer is expected
}
MyEnum e;
switch (e) {
   case VALUE_A: // <- an element of the enumeration is expected
}
Kru
sumber
14
Mengapa harus tidak memenuhi syarat?
Thorbjørn Ravn Andersen
11
Jika Anda dapat memenuhi syarat, maka Anda mungkin menggunakan sesuatu MyEnumyang tidak masuk akal.
Kru
1
@ Kir, tapi saya bisa menggunakan sesuatu yang gramatikal-lain untuk ekspresi case non-enum. Misalnya static final int MY_CONST = 7; …; switch(intVariable) {case MY_CONST: …;}bukannya case 7. Jadi pembatasan untuk enum ini tidak masuk akal (saya tidak hanya dapat menggunakan literal primer, tetapi juga konstanta yang didefinisikan secara manual untuk switchekspresi integer , tetapi saya tidak dapat menggunakan konstanta yang ditentukan secara manual, tetapi hanya nama primer untuk enum).
Sasha
4

ini harus dilakukan:

//Main Class
public class SomeClass {

    //Sub-Class
    public static class AnotherClass {
        public enum MyEnum {
            VALUE_A, VALUE_B
        }    
        public MyEnum myEnum;
    }

    public void someMethod() { 
        AnotherClass.MyEnum enumExample = AnotherClass.MyEnum.VALUE_A; //...

        switch (enumExample) {
            case VALUE_A: { //<-- error on this line
            //..
            break;
            }
        }
    }
}
Woyzeck
sumber
Anda menyelamatkan hari!
Soham Mehta
3

Salah:

case AnotherClass.MyEnum.VALUE_A

Baik:

case VALUE_A:
Akash Yellappa
sumber
1
Saya mengangkat suara Anda karena lebih jelas tentang apa masalahnya.
joaorodr84
2

Ini adalah bagaimana saya menggunakannya. Dan itu bekerja dengan fantastis -

public enum Button {
        REPORT_ISSUES(0),
        CANCEL_ORDER(1),
        RETURN_ORDER(2);

        private int value;

        Button(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }
    }

Dan switch-caseseperti yang ditunjukkan di bawah ini

@Override
public void onClick(MyOrderDetailDelgate.Button button, int position) {
    switch (button) {
        case REPORT_ISSUES: {
            break;
        }
        case CANCEL_ORDER: {
            break;
        }
        case RETURN_ORDER: {
            break;
        }
    }
}
Jimit Patel
sumber
0

Tulis someMethod()dengan cara ini:

public void someMethod() {

    SomeClass.AnotherClass.MyEnum enumExample = SomeClass.AnotherClass.MyEnum.VALUE_A;

    switch (enumExample) {
    case VALUE_A:
        break;
    }

}

Dalam pernyataan beralih Anda harus menggunakan nama konstan saja.

dash1e
sumber