Java: alt sınıf altında enum ile switch deyimini kullanma


265

Öncelikle C # 'daki numaralara daha aşina olduğumu ve java'daki numaraların oldukça dağınık olduğunu belirteceğim.

Gördüğünüz gibi, bir sonraki örneğimde @ enums bir switch deyimi kullanmaya çalışıyorum ama ne yaptığım önemli değil.

Aldığım hata:

Nitelikli vaka etiketi SomeClass.AnotherClass.MyEnum.VALUE_A, niteliksiz numaralandırma sabiti ile değiştirilmelidirVALUE_A

Şey, hatayı oldukça anlıyorum ama enum başka bir alt sınıfta bulunduğundan sadece VALUE_A yazamıyorum. Bu sorunu çözmenin bir yolu var mı? Peki neden Java'da oluyor?

//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;
            }
        }
    }
}

Darrengorman yorumladığı gibi, Java Enumvardır derece bunların asmak aldıktan sonra kullanışlı - hepsi değil bir karışıklık. Diğer platformlarda görüldüğü gibi basit numaralardan (yalnızca etiketli bir tam sayı değeri) çok daha esnek ve pratiktirler. Oracle Eğiticisine bakın . Optimize edilmiş Set/ Mapuygulamaları keşfedin : EnumSet& EnumMap.
Basil Bourque

1
Vaka bildirimini nitelemeye çalıştığınızda; bir şekilde, tek bir anahtar deyiminde farklı türdeki numaralandırmaları (yalnızca aynı numaralandırma türünü değil) karıştırabildiğimi söylemeye çalışıyorsunuz. Java, burada tartışıldığı gibi bu yaklaşımla durdu digizol.com/2010/10/enum-case-label-switch-java-qualified.html
lkamal

Bu, IntelliJ 2018'de bir sınıfı yeniden düzenlerken (taşırken) bana oldu.2
Daniel Alder

Yanıtlar:


570

Bunu şu şekilde değiştirin:

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

İpucu hatada. caseEtiketleri enum türüyle nitelemenize gerek yoktur , sadece değeri vardır.


20
Tamam çok aptal hissediyorum :-( Tamamen haklısınız, ben bu kesin çizgi denedim ve bir hata var ikna oldu bu yüzden dava hak kazanmak için taşındı, ama öneriniz işe yarıyor.
Popokoko

4
Bu arada, Java'daki numaralandırmaların onları daha fazla kullanmaya başladığınızda inanılmaz derecede yararlı olduğunu göreceğinizi düşünüyorum, hiç bir karışıklık olduklarını söyleyemem :)
darrengorman

11
@milkplusvellocet, bu yazının zaten eski olduğunu biliyorum, ancak Java'nın neden anahtar deyiminde nitelikli vaka etiketine izin vermediğini merak ediyorum ?
jzarsuelo

3
@ cRane01 emin değilim, ama daha temiz bir sözdizimi yapar. Her vaka için tür belirtmek tamamen gereksiz olacaktır
darrengorman

3
@HelloGoodbye Hayır. Switch ifadesinin değişkeni, vaka ifadesinin türünü tanımlar, böylece yalnızca bir numaralandırma olabilir.
sprinter

33

Java, öğelerin türünü otomatik olarak girer case, bu nedenle etiketlerin niteliksiz olması gerekir.

int i;
switch(i) {
   case 5: // <- integer is expected
}
MyEnum e;
switch (e) {
   case VALUE_A: // <- an element of the enumeration is expected
}

14
Neden gerekir o niteliksiz olması?
Thorbjørn Ravn Andersen

11
Hak kazanabiliyorsanız, MyEnummantıklı olmayan başka bir şey kullanabilirsiniz .
Kru

1
@Kru ama olabilir olmayan enum yazılan vaka ifadeleri dilbilgisi-başka bir şey kullanın. Örneğin static final int MY_CONST = 7; …; switch(intVariable) {case MY_CONST: …;}yerine case 7. Çeteleler için bu kısıtlama yapar Yani hiçbir anlam (ı birincil değişmezleri ama tamsayı için elle de tanımlanmış sabitleri sadece kullanabilirsiniz switchifadesi, ama çeteleler için elle tanımlanmış sabitleri, fakat sadece birincil isimlerini kullanamazsınız).
Sasha

4

bunu yapmalı:

//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;
            }
        }
    }
}

Günü kurtardın!
Soham Mehta

3

Yanlış:

case AnotherClass.MyEnum.VALUE_A

Sağ:

case VALUE_A:

1
Sizinkini onayladım çünkü sorunun ne olduğu konusunda daha net.
joaorodr84

2

Ben böyle kullanıyorum. Ve fevkalade çalışıyor -

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;
        }
    }

Ve switch-caseaşağıda gösterildiği gibi

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

0

someMethod()Bu şekilde yazın :

public void someMethod() {

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

    switch (enumExample) {
    case VALUE_A:
        break;
    }

}

Switch deyiminde yalnızca sabit adı kullanmalısınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.