2012-10-25 10 views
16

Jeśli enum implementuje porównywalne, więc dlaczego nie można porównać z < lub>?Jak można porównać dwie wartości wyliczeniowe z "<"?

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

Co to pytanie ma wspólnego z SCJP/OCPJP? –

+0

Jest to temat egzaminacyjny ** Sekcja 1 **: Deklaracje, inicjowanie i określanie zakresów * Opracowanie kodu deklarującego klasy (łącznie ze streszczeniem i wszystkimi klasami zagnieżdżonymi), interfejsów i wyliczeń oraz obejmującego odpowiednie użycie pakietu i instrukcje importu (w tym import statyczny). * Opracowanie kodu deklarującego, inicjującego i używającego elementów podstawowych, tablic, wyliczeń i obiektów jako zmiennych statycznych, instancji i lokalnych. Ponadto użyj nazw prawnych do nazw zmiennych. http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=41&p_exam_id=1Z0_851 – Joe

Odpowiedz

31

Można to zrobić:

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

oczywiście zakładając, że BIGGEST został uznany poBIG w wyliczeniu. Wartość porządkowa w wyliczeniu jest niejawnie powiązana z porządkiem deklaracji, domyślnie pierwsza wartość ma przypisaną wartość 0, drugą wartość 1 i tak dalej.

Więc jeśli yo ogłoszony wyliczenie takiego, wszystko będzie działać:

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 Jeśli byłeś "WIĘKSZY", mógł to być porządek 4.;) –

+0

Czy to jest poprawne powiedzieć, że PinSize.BIGGEST jest zmienną referencyjną, np tablica int []; ? – MrKiller21

+0

@ miller.bartek 'PinSize.BIGGEST' jest wartością wyliczeniową, nie jest właściwe porównywanie jej z tablicą. W każdym razie, w Javie wszystkie zmienne wskazujące na obiekty (w tym wyliczenia, tablice) są odniesieniami –

12

Wdrażanie Comparable nie oznacza, że ​​można użyć < lub >. Możesz tylko użyć tych z wartościami liczbowymi.

To tylko oznacza, że ​​istnieje metoda compareTo(). Spróbuj tego:

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

Ta metoda zwróci int, która jest mniejsza, równa lub większa niż 0 ° C, w zależności, która wartość jest „większy”. W przypadku wartości enum "wielkość" zależy od kolejności definicji wartości wyliczeniowej.

1

Odpowiedzi warunkiem wyjaśnić problem dobrze, ale chciałbym dodać moje spostrzeżenia, bo czuję, że nie odpowie pytanie "dlaczego nie można porównać z < lub>" ?. Problem sprowadza się do porównywania odniesień. PinSize.BIGGEST i PinSize.BIGGERER są zmiennymi referencyjnymi. To samo co poniżej:

String s; 
int[] array; 
MyObject myObject; 

Reprezentują adresy w pamięci. Co więcej, wyliczenia są singletonami, więc zawsze istnieje jeden obiekt określonego rodzaju. Z tego powodu poniższa linia jest dozwolona i zwraca wartość true.

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

Próba sprawdzenia, czy jeden adres w pamięci jest większa lub mniejsza niż inny adres w pamięci jest niemożliwe. Implementacja porównywalnego interfejsu i metody compareTo() daje szansę na dostarczenie własnego niestandardowego sposobu porównywania obiektów, a nie adresów w pamięci.

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