2013-01-19 38 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"; 
     } 
    } 
} 

我有這樣的信息是可用的枚舉。如何在java中打印所有枚舉值?

  1. 如何打印所有枚舉值,如:print.generalInformation

輸出:

名稱
教育
電子郵件
電話

  • 如何該枚舉generalInformation通過如在ARG另一個功能?
  • +2

    你不必須在每個枚舉元素中重寫'toString'方法。每個枚舉都有方法name(),它返回調用此方法的元素的String表示形式:SomeEnum.VALUE.name()將返回「VALUE」字符串。你可以在你的主'toString()'中返回name()。charAt(0)+ name()。substring(1).toLowerCase();'在這裏http://ideone.com/IraxgB。 – Pshemo

    回答

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

    你的第二個部分...只是一樣的interfaceclass

    13

    首先,我會重構您的枚舉在構造函數參數中傳遞字符串表示形式。該代碼位於底部。

    現在,打印你只是使用的東西像所有枚舉值:

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

    使用EnumSet將是一個替代使用GeneralInformation.values(),但是這意味着你必須每次創建一個新的數組你稱之爲,這讓我覺得很浪費。無可否認,要求EnumSet.allOf每次都需要一個新的對象......如果你正在做這個很多並且關心性能,你總是可以將它緩存在某個地方。

    您可以使用GeneralInformation就像任何其他類型的,當涉及到的參數:

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

    一個值,例如調用

    doSomething(GeneralInformation.PHONE); 
    

    使用構造函數參數

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

    與您當前值,你可以實際上只是自動轉換名稱首字母大寫重構 - 但是這不會很從長遠來看是靈活的,我認爲這個明確的版本更簡單。

    0

    在實際應用中,它是從演示中分離數據很好的做法。它允許數據在不同的用戶界面中使用,它使數據對象更輕量化,並且允許未來的可能性爲internationalization

    考慮到這一點,最好避免將顯示名稱與枚舉常量強耦合。幸運的是,有一個類使得這很簡單: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

    由於的Java 8我建議以下解決方案:

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

    如果你仍然對Java的1.7,這是對我工作:

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