2012-10-25 11 views
16

Enum Karşılaştırılabilir'i uygularsa, neden < ile karşılaştırılamaz veya>?İki enum değerini '<' ile nasıl kıyaslayamıyoruz?

public class Dream  
{ 
    public static void main(String... args) 
    { 
     System.out.println(PinSize.BIG == PinSize.BIGGER); //false 
     System.out.println(PinSize.BIG == PinSize.BIG); //true 
     System.out.println(PinSize.BIG.equals(PinSize.BIGGER));//false 
     System.out.println(PinSize.BIG > PinSize.BIGGERER);// compilation error 
     //can't be compared 
     System.out.println(PinSize.BIG.toString().equals(PinSize.BIGGER));// #4 
     PinSize b = PinSize.BIG ; 
     System.out.println(b instanceof Comparable);// true 
    } 
} 
enum PinSize { BIG, BIGGER, BIGGERER }; 
+0

Bu sorunun SCJP/OCPJP ile ne ilgisi var? –

+0

Sınav konuları, ** Bölüm 1 **: Bildirimler, Başlatma ve Kapsam Belirleme * Sınıfları (iç içe geçmiş sınıfların soyut ve tüm formları dahil), arabirimleri ve enumları açıklayan kod geliştirin ve paketin uygun kullanımını içerir ve ithalat ifadeleri (statik ithalat dahil). * İlkel, dizi, enum ve nesneleri statik, örnek ve yerel değişkenler olarak bildiren, ilklendiren ve kullanan kodlar geliştirin. Ayrıca, değişken isimleri için yasal tanımlayıcıları kullanın. http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=41&p_exam_id=1Z0_851 – Joe

cevap

31

Bunu yapabilirsin: Elbette

PinSize.BIGGEST.ordinal() > PinSize.BIG.ordinal() // evaluates to `true` 

, BIGGEST numaralandırmaBIG sonra ilan edildi varsayarak. Bir numaralandırmadaki sıralı değer örtük olarak bildirim sırasına bağlıdır, ilk değere 0, ikinci değer 1 ve benzeri atanır.

public enum PinSize { 
    SMALLEST, // ordinal value: 0 
    SMALL,  // ordinal value: 1 
    NORMAL, // ordinal value: 2 
    BIG,  // ordinal value: 3 
    BIGGER, // ordinal value: 4 
    BIGGEST; // ordinal value: 5 
} 
+0

+1 "BIGGER" e sahip olsaydınız, sıradan 4. olabilirdi;) –

+0

Doğru mu? PinSize.BIGGEST'in örn. int [] dizisi; ? – MrKiller21

+0

@ miller.bartek 'PinSize.BIGGEST, bir enum değeridir, bir diziyle karşılaştırmak doğru değildir. Ve her neyse, Java'da tüm değişkenler nesnelere işaret ediyor (enumlar, diziler dahil) referanslar –

12

Comparable uygulanması, < veya > kullanabilirsiniz anlamına gelmez. yalnızca sayısal değerleri olanları kullanabilirsiniz.

Sadece compareTo() yöntemi olduğu anlamına gelir. Bu deneyin:

System.out.println(PinSize.BIG.compareTo(PinSize.BIGGER)); 

Bu yöntem, değeri "daha büyük" olan bağlı olarak, 0 dan daha küçük eşit ya da daha büyük olan bir int döndürür. enum değerlerinde "boyut" enum değeri tanımlarının sırasına bağlıdır.

1

cevaplar problemi iyi açıklamak sağlanan, ama onlar cevap yok hissediyorum çünkü benim bakış açısı eklemek istiyorum:

Yani yo böyle sayımını ilan eğer işler çalışacak sorusu "neden < veya>" ile karşılaştırılamaz? " Sorun referansları karşılaştırmaya geliyor. PinSize.BIGGEST ve PinSize.BIGGERER başvuru değişkenleridir. Aşağıdakilerle aynı: bellekte adresleri temsil ederler. Dahası, enumlar bekardır, dolayısıyla her zaman belirtilen türden bir nesne vardır. Bu nedenle aşağıdaki satır izin verilir ve doğru döner. hafızada bir adres belleği diğer adresinden daha büyük ya da daha küçük olup olmadığını kontrol etmek için çalışmak

System.out.println(PinSize.BIG == PinSize.BIG); //true 

imkansızdır. Karşılaştırılabilir arabirim ve compareTo() yöntemi uygulamak, bellekte olmayan adresleri karşılaştırmak için kendi özel yönteminizi sağlama şansı verir.

System.out.println(PinSize.BIG > PinSize.BIGGERER); // not possible