2013-04-19 12 views
6

proszę moje pytanie są dwie i bardzo prostePowrót obliczona wartość od wyliczenia

  1. wypaczyła wyliczenia jak

  2. ten pomysł brakuje kilka ważnych abstrakcji w moim przykładowym kodzie

kod , gdzie oprt.calc(x, y) nie jest compilable, z ostrzeżeniem cannot find symbol

public enum Operation { 

    PLUS { 
     public double calc(double x, double y) { 
      return x + y; 
     } 
    }, 
    MINUS { 
     public double calc(double x, double y) { 
      return x - y; 
     } 
    }, 
    MULTILPLE { 
     public double calc(double x, double y) { 
      return x * y; 
     } 
    }, 
    DIVIDED_BY { 
     public double calc(double x, double y) { 
      return x/y; 
     } 
    }; 

    public static void main(String args[]) { 
     double x = 15.25; 
     double y = 24.50; 
     for (Operation oprt : Operation.values()) { 
      System.out.println(x + " " + oprt + " " 
        + y + " = " + oprt.calc(x, y)); 
     } 
    } 
} 
+0

Na marginesie, to brzmi jak stosowanie perfekt Lambda wyrażeń z Nadchodzące cechą Java 8. http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html – sulai

+0

Komunikat o błędzie, który pojawia się, gdy ładuję to do zaćmienia, jest 'Metoda calc (double, double) jest niezdefiniowana dla typu Operation', która wskazuje na rozwiązania, które inni przedstawili poniżej. –

+0

+1 Nie wiedziałem, że jest coś takiego z enum. – Vinay

Odpowiedz

8

Co pominięcia jest abstrakcyjną deklarację metody calc():

enum Operation { 

    PLUS { 
     public double calc(double x, double y) { 
      return x + y; 
     } 
    }, 
    MINUS { 
     public double calc(double x, double y) { 
      return x - y; 
     } 
    }, 
    MULTILPLE { 
     public double calc(double x, double y) { 
      return x * y; 
     } 
    }, 
    DIVIDED_BY { 
     public double calc(double x, double y) { 
      return x/y; 
     } 
    }; 

    **public abstract double calc(double x, double y);** 

    public static void main(String args[]) { 
     double x = 15.25; 
     double y = 24.50; 
     for (Operation oprt : Operation.values()) { 
      System.out.println(x + " " + oprt + " " 
        + y + " = " + oprt.calc(x, y)); 
     } 
    } 
} 
7

Musisz zadeklarować metody abstrakcyjne double calc(double x, double y) w enum bezpośrednio, i zastąpić go w każdym państwie enum.

+0

czy możesz wyjaśnić drugą część odpowiedzi, "i zmienić ją w każdym członku enum", czy jest coś bezpieczniejszego, innego dodatkowego lub ..., w porównaniu z odpowiedzią @Adam Dyga – mKorbel

+0

Nie. Kod Adama jest tym, co miałem na myśli. Lubię dodawać adnotację @Override do metod nadpisujących inną metodę, aby mieć błąd z kompilatora, jeśli nazwa metody bazowej jest zmieniona, usunięta lub zmienia swój podpis, ale w tym konkretnym przypadku nie jest zbyt użyteczna, z wyjątkiem dokumentacji cel, powód. –

+0

:-) Przepraszam, nie była to dla mnie wyraźna adnotacja, masz rację, IDE zostało powiadomione o – mKorbel

3

Ty nadrzędne calc(), a nie masz oryginalnego calc() metody. Albo zadeklarować metody abstrakcyjne:

public abstract double calc(double x, double y); 

lub zadeklarować konkretną metodę z realizacji domyślnie:

public double calc(double x, double y) 
{ 
    // ... 
} 
2

To nie kompiluje ponieważ obecnie metoda calc istnieje tylko w każdej z możliwych wartości Twój enum - ale to nie istnieje na typu samaOperation. Właśnie dlatego twój kompilator (i mój) nie akceptuje tego.

Należy zatem zdefiniować metodę w postaci typu. Może coś takiego:.

public abstract double calc(double x, double y); 

swoje wartości enum (PLUS, MINUS, MULTIPLE i DIVIDED_BY każdego wdrożenia tej metody

2
public double calc(double x, double y){} 

jest taka sama jak

private double calc(double x,double y){} 

chyba dodać calc() metody do enum Operation. Jak na JLS:

Instance methods declared in these class bodies are may be invoked outside 
the enclosing enum type only if they override accessible methods in 
the enclosing enum type. 

Więc w zasadzie, rodzaj oprt jest Operation i jak Operation nie ma żadnego oświadczenia o metodzie zwanej double calc(double x,double y), nie można wywołać metodę z wykorzystaniem oprt. W skrócie, metody zdefiniowane w ciałach klasowych powinny zostać zastąpione metodami, aby były dostępne na zewnątrz.

3

Poprawna składnia stosowanie metod enum jest:

private enum Operation { 
    PLUS, MINUS, MULTILPLE, DIVIDED_BY; 

    public double calc(double x, double y) { 
     switch (this) { 
     case PLUS: 
      return x + y; 
     case MINUS: 
      return x - y; 
     case MULTILPLE: 
      return x * y; 
     case DIVIDED_BY: 
      return x/y; 
     } 
     return 0; 
    } 
} 

public static void main(String args[]) throws IOException { 

    double x = 15.25; 
    double y = 24.50; 
    for (Operation oprt : Operation.values()) { 
     System.out.println(x + " " + oprt + " " + y + " = " 
       + oprt.calc(x, y)); 
    } 

} 
+0

+1 dla Nice Implement! – NINCOMPOOP

+2

Wyliczenia Java mogą mieć abstrakcyjne metody, które można zaimplementować dla każdej konkretnej wartości wyliczeniowej; Myślę, że jest to lepsze rozwiązanie niż twoje z przełącznikiem w większości przypadków –

+0

czy możesz wyjaśnić, dlaczego ta metoda musi być obecna? jaka jest "semantyczna" dla tej enumowniczej decyzji projektowej? – Roxana

Powiązane problemy