2013-01-19 11 views
10
enum generalInformation { 
    NAME { 
     @Override 
     public String toString() { 
      return "Name"; 
     } 
    }, 
    EDUCATION { 
     @Override 
     public String toString() { 
      return "Education"; 
     } 
    }, 
    EMAIL { 
     @Override 
     public String toString() { 
      return "Email"; 
     } 
    }, 
    PROFESSION { 
     @Override 
     public String toString() { 
      return "Profession"; 
     } 
    }, 
    PHONE { 
     @Override 
     public String toString() { 
      return "Phone"; 
     } 
    } 
} 

Mam dostępne informacje w enum.jak wydrukować całą wartość wyliczenia w java?

  1. Jak wydrukować wszystkie wartości wyliczeniowe, takie jak: print.generalInformation?

która wyprowadza:

Nazwa
Edukacja
email
Telefon

  1. Jak przekazać ten enum generalInformation jako arg w inna funkcja?
+2

nie robić muszą przesłonić metodę 'toString' w każdym elemencie wyliczającym. Każdy enum ma nazwę metody(), która zwraca reprezentację String elementu, który wywołał tę metodę: 'SomeEnum.VALUE.name()' zwróci ciąg "VALUE". Możesz po prostu "zwrócić name(). CharAt (0) + name(). Substring (1) .toLowerCase();' w twoim głównym 'toString()' jak tutaj http://ideone.com/IraxgB. – Pshemo

Odpowiedz

23
System.out.println(java.util.Arrays.asList(generalInformation.values())); 

Twoja druga część ... Tak samo jak interface lub class

13

Po pierwsze, chciałbym refaktoryzować twoje wyliczenie, aby przekazać reprezentację ciągów w parametrze konstruktora. Ten kod jest na dole.

Teraz, aby wydrukować wszystkie wartości enum chcesz po prostu użyć coś takiego:

// Note: enum name changed to comply with Java naming conventions 
for (GeneralInformation info : EnumSet.allOf(GeneralInformation.class)) { 
    System.out.println(info); 
} 

Alternatywą korzystania EnumSet byłoby wykorzystanie GeneralInformation.values(), ale to oznacza, że ​​trzeba stworzyć nową tablicę za każdym razem nazwij to, co wydaje mi się nierozważne. Z pewnością dzwonienie pod numer EnumSet.allOf wymaga też za każdym razem nowego obiektu ... jeśli robisz to lot i martwisz się wydajnością, zawsze możesz go gdzieś umieścić w pamięci podręcznej.

Można użyć GeneralInformation podobnie jak innego rodzaju, jeśli chodzi o parametrach:

public void doSomething(GeneralInformation info) { 
    // Whatever 
} 

wywołana z wartością, np

doSomething(GeneralInformation.PHONE); 

Refaktoryzacja za pomocą parametru konstruktora

public enum GeneralInformation { 
    NAME("Name"), 
    EDUCATION("Education"), 
    EMAIL("Email"), 
    PROFESSION("Profession"), 
    PHONE("Phone"); 

    private final String textRepresentation; 

    private GeneralInformation(String textRepresentation) { 
     this.textRepresentation = textRepresentation; 
    } 

    @Override public String toString() { 
     return textRepresentation; 
    } 
} 

Ze swoimi bieżących wartości, można właściwie tylko konwertować nazwę na tytułowej przypadku automatycznie - ale to nie byłoby bardzo elastyczny w perspektywie długoterminowej i myślę, że ta jawna wersja jest prostsza.

0

w aplikacji, jest to dobra praktyka, aby oddzielić dane z prezentacji. Pozwala na wykorzystanie danych w różnych interfejsach użytkownika, czyni obiekty danych bardziej lekkimi i pozwala na przyszłą możliwość internationalization.

Mając to na uwadze, dobrze jest unikać silnego sprzężenia nazwy wyświetlanej ze stałą wyliczeniową. Na szczęście istnieje klasa, która to ułatwia: EnumMap.

public class ApplicationUI { 
    private final Map<GeneralInformation, String> names; 

    public ApplicationUI() { 
     names = new EnumMap<>(GeneralInformation.class); 

     names.put(GeneralInformation.NAME,  "Name"); 
     names.put(GeneralInformation.EDUCATION, "Education"); 
     names.put(GeneralInformation.EMAIL,  "Email"); 
     names.put(GeneralInformation.PROFESSION, "Profession"); 
     names.put(GeneralInformation.PHONE,  "Phone"); 

     assert names.keySet().containsAll(
      EnumSet.allOf(GeneralInformation.class)) : 
      "Forgot to add one or more GeneralInformation names"; 
    } 

    public String getNameFor(GeneralInformation info) { 
     return names.get(info); 
    } 
} 
1

Od Java 8 proponuję następujące rozwiązanie:

public static String printAll() { 
    return Stream.of(GeneralInformation.values()). 
       map(GeneralInformation::name). 
       collect(Collectors.joining(", ")); 
} 
0

Jeśli nadal na Java 1.7 jest to, co pracował dla mnie:

String genInfoValues = ""; 
boolean firstRun = true; 
for (generalInformation info : generalInformation.values()){ 
    if (firstRun) { 
     firstRun = false; 
     genInfoValues += info.name(); 
    } else { 
     genInfoValues += ", " + info.name(); 
    } 
} 
Powiązane problemy