2016-10-05 16 views
2

私は、各システムのunitSystemNameを含む配列である{"Imperial", "Metric"};を持っているでしょうString[] lを取得しようとしています列挙JavaのEnumからString []を取得するより良い方法はありますか?

public enum UnitSystem { 
    ImperialSystem("Imperial", "in.", 1), 
    MetricSystem("Metric", "cm.", 2.54); 
    private String unitSystemName; 
    private String lengthSuffix; 
    private double lengthCoeff; 

を持っています。今すぐベストベットは:

String[] l = Arrays.stream(UnitSystem.values()).map(UnitSystem::name).collect(Collectors.toList()).toArray(new String[UnitSystem.values().length]); 

これを実装する方法はありますか?

+1

Enum自体の代わりにEnumのフィールドについては、それが良いonelinerソリューションです。 Verryを定期的に必要とする場合は、いつでも簡単なアクセスとパフォーマンスの誘導のためにフィールドに格納することができます。 – n247s

答えて

0
public enum UnitSystem { 
    ImperialSystem("Imperial", "in.", 1), 
    MetricSystem("Metric", "cm.", 2.54); 

    UnitSystem(String unitSystemName, String lengthSuffix, double lengthCoeff) { 
     this.UNITE_SYSTEM_NAME = unitSystemName; 
     this.LENGTH_SUFFIX = lengthSuffix; 
     this.LENGTH_CO_EFF = lengthCoeff; 
    } 

    private final String UNITE_SYSTEM_NAME; 
    private final String LENGTH_SUFFIX; 
    private final double LENGTH_CO_EFF; 

    public static String[] getNames() { 
     String[] strings = new String[UnitSystem.values().length]; 
     short count = 0; 
     for (UnitSystem s : UnitSystem.values()) { 
      strings[count] = s.getName(); 
      count++; 
     } 
     return strings; 
    } 

    public String getName() { 
     return UNITE_SYSTEM_NAME; 
    } 

    public String getLengthSuffix() { 
     return LENGTH_SUFFIX; 
    } 

    public double getLengthCoeff() { 
     return LENGTH_CO_EFF; 
    } 
} 

UnitSystemの各インスタンスのためのゲッターメソッドと列挙を完了することによって、我々は、すべてのこの列挙名データの文字列配列を返す静的メソッドを作成することができます。お役に立てれば!

1

どこかに移動して、それらから名前を抽出する必要があります。カルバンの答えのような列挙型のコードの中にあるか、そうでないかのようなものです。これを回避する方法はない(少なくとも私が考えることはできない)。

あなたのコードを少しでも整理できます。リストへのストリームを収集し、その配列に変換する理由はありません - あなたは、直接配列に変換できます。

String[] l = 
Arrays.stream(UnitSystem.values()).map(UnitSystem::name).toArray(String[]::new); 
0

unitSystemNameのgetterを宣言し、Stream<String>からString[]に変換しtoArray(String[]::new)を使用しています。

public enum UnitSystem { 
    ... 

    UnitSystem(String unitSystemName, String lengthSuffix, double lengthCoeff) { 
     this.unitSystemName = unitSystemName; 
     ... 
    } 

    public String getUnitSystemName() { 
     return unitSystemName; 
    } 

    public static String[] getNames() { 
     return Arrays.stream(UnitSystem.values()) 
       .map(UnitSystem::getUnitSystemName) 
       .toArray(String[]::new); 
    } 
} 
0

名前の静的配列を作成すると、クラスローダーがクラスをロードするときに一度だけ読み込まれるようになります。あなたがこのリストを2回以上参照する機会があれば理想的でしょう。

public enum UnitSystem 
{ 
    ImperialSystem("Imperial", "in.", 1), MetricSystem("Metric", "cm.", 2.54); 
    private String unitSystemName; 

    private String lengthSuffix; 

    private double lengthCoeff; 

    private static String[] names = Arrays.stream(UnitSystem.values()) 
     .map(UnitSystem::name).toArray(String[]::new); 

    UnitSystem(String unitSystemName, String lengthSuffix, double lengthCoeff) 
    { 
    this.unitSystemName = unitSystemName; 
    this.lengthSuffix = lengthSuffix; 
    this.lengthCoeff = lengthCoeff; 
    } 

    public static String[] getNames() 
    { 
    return names; 
    } 

    public String getUnitSystemName() 
    { 
    return unitSystemName; 
    } 

    public String getLengthSuffix() 
    { 
    return lengthSuffix; 
    } 

    public double getLengthCoeff() 
    { 
    return lengthCoeff; 
    } 
} 
関連する問題