Gibt es einen besseren Weg, um String[] Enum in Java?

Ich habe eine enum –

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

Ich versuche String[] l hätte {"Imperial", "Metric"}; ist ein array mit unitSystemName jedes system. Jetzt meine beste Wette ist:

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

Gibt es einen besseren Weg, um es zu implementieren?

  • Wenn Ihr über die Felder der Enum statt der Enum selbst, als, dass ist eine gute oneliner Lösung. Wenn Sie es brauchen, auf einer sehr regelmäßigen basis, können Sie immer wählen, um es zu speichern in einem Feld für leichte Erreichbarkeit und Leistung der Induktion.
InformationsquelleAutor Stepan | 2016-10-05



4 Replies
  1. 2

    Du musst gehen über die enum-Werte irgendwo und extrahieren Sie die Namen von Ihnen, sei es innerhalb der enum-code wie Calvins Antwort suggeriert oder außerhalb von Ihr, wie Sie getan haben. Es gibt keine Möglichkeit (zumindest keine Möglichkeit, die ich denken kann), dies zu umgehen.

    Geben Sie den code könnte gereinigt werden, bis ein bisschen, obwohl. es gibt keinen Grund, zu sammeln, den stream einer Liste und dann konvertieren Sie Sie in ein array – man könnte konvertieren es in ein array direkt:

    String[] l = 
    Arrays.stream(UnitSystem.values()).map(UnitSystem::name).toArray(String[]::new);
  2. 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;
        }
    }

    Durch den Abschluss des enum mit getter-Methoden für jede Instanz einer UnitSystem, wir können erstellen Sie eine statische Methode gibt ein String-array, der alle diese Enumerationen, die den Namen Daten. Hoffe, das hilft!

  3. 0

    Deklarieren getter für unitSystemName und verwenden toArray(String[]::new) konvertieren von Stream<String> zu String[].

    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);
        }
    }
  4. 0

    Machen aus einem Statischen array von Namen, die es Ihnen ermöglichen, die nur einmal geladen werden, wenn der classloader lädt die Klasse. Wenn es irgendeine chance, dass Sie einen Verweis auf diese Liste mehr als einmal wäre es ideal.

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.