JavaRush /Java-Blog /Random-DE /Konvertieren von Enum in String

Konvertieren von Enum in String

Veröffentlicht in der Gruppe Random-DE
Heute sprechen wir über die Arbeit mit String-Aufzählungen und insbesondere über enumKlassen, die die Interaktion mit String-Konstanten organisieren. Konvertieren von Enum in String - 1

Verwenden von String-Enumerationen

Während der Anwendungsentwicklung müssen Sie regelmäßig mit einem festen Satz von Zeichenfolgewerten arbeiten. Es könnte alles sein. Zum Beispiel eine Liste der von der Anwendung unterstützten Farbcodes oder eine Liste der Geräte, mit denen unsere Anwendung interagieren kann, Jahreszeiten usw. Dabei handelt es sich um einen vordefinierten Satz von String-Konstanten mit einer gemeinsamen Struktur, mit denen die Programminteraktion auf der Java-Codeebene hergestellt werden muss. Wenn Sie mit einem vordefinierten Satz von String-Konstanten (und anderen Konstanten) interagieren müssen, besteht die beste Lösung darin, eine eigene enumKlasse zu schreiben. Nachfolgend sehen wir uns Beispiele für die Konvertierung enuman string.

String-Aufzählungen erstellen

Erstellen wir enumeine Klasse, die eine Liste verschiedener Umgebungen für die Bereitstellung der Anwendung sowie die URL jeder Umgebung speichert:
public enum Environment {
    PROD("https://release.application.com/"),
    TEST("https://test.application.com/"),
    AUTO_TEST("https://autotest.application.com/"),
    DEV("http://localhost:8080");

    private final String url;

    Environment(String url) {
        this.url = url;
    }

    public String getUrl() {
        return url;
    }
}
In dieser Klasse haben wir 4 Umgebungen definiert:
  • PROD- freigeben
  • TEST— für manuelle Tests
  • AUTO_TEST— Umgebung für Autotests
  • DEV– lokal für Entwicklung und Debugging
Und auch 4 URLs für jede dieser Umgebungen. Achten wir auf einige wichtige Punkte.
  1. Jede URL ist eine String-Konstante in unserer Aufzählung: Sie wird in Klammern neben jeder enumKonstante definiert.
  2. Es muss einen Konstruktor geben, der als jede Konstante ein Argument desselben Typs akzeptiert enum.
  3. Der Gültigkeitsbereich des Konstruktors ist privateentweder package private.
  4. Es ist notwendig, eine Variable zu definieren – ein Klassenfeld, das die von uns definierten String-Konstanten speichert. Sie müssen für dieses Feld eine Getter-Methode erstellen, um die Werte von String-Konstanten extern zu verwenden.

Iterieren über String-Aufzählungen

Zu diesem Zeitpunkt können wir bereits über alle verfügbaren Werte iterieren enumund ihnen zugeordnete String-Konstanten abrufen. Um alle Werte einer beliebigen enumKlasse zu erhalten, müssen Sie die folgende Methode verwenden values():
public class Main {
    public static void main(String[] args) {
        for (Environment env : Environment.values()) {
            System.out.println(env + " : " + env.getUrl());
        }
    }
}
Abschluss:

PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
Wie aus dem Beispiel hervorgeht, haben enumwir zum Drucken des Namens der Konstante ihn an die Methode übergeben System.out.println, und zum Drucken der mit dieser Konstante verknüpften URL haben wir den von uns definierten Getter verwendet.

Eine String-Konstante aus der Enumeration abrufen

Um den Wert einer beliebigen String-Konstante zu erhalten, können wir auch einen Getter für jede enumKonstante aufrufen:
public class Main {
    public static void main(String[] args) {

        String prodUrl = Environment.PROD.getUrl();
        String devUrl = Environment.DEV.getUrl();

        System.out.println("Production url is: " + prodUrl);
        System.out.println("Development url is: " + devUrl);

    }
}
Abschluss:

Production url is: https://release.application.com/
Development url is: http://localhost:8080

Enum-Konstante nach Namen abrufen

enumManchmal ist es notwendig , eine Konstante anhand ihres Stringnamens abzurufen . Dies geschieht mit der Methode valueOf(String), die eine Konstante anhand ihres Namens zurückgibt:
public class Main {
    public static void main(String[] args) {

        Environment prod = Environment.valueOf("PROD");
        Environment dev = Environment.valueOf("DEV");

        System.out.println("Production url is: " + prod.getUrl());
        System.out.println("Development url is: " + dev.getUrl());

    }
}
Abschluss:

Production url is: https://release.application.com/
Development url is: http://localhost:8080
Doch hier ist Vorsicht geboten. Wenn die Methode keine Konstante mit dem angegebenen Namen findet enum, wird eine Ausnahme ausgelöst java.lang.IllegalArgumentException.

Konvertieren von String in Enum

Manchmal entsteht das gegenteilige Bedürfnis. Wenn Sie den Wert kennen enum, erhalten Sie enumdie Konstante selbst. Diese. In unserem Beispiel müssen Sie, wenn Sie eine bestimmte Adresse kennen, die entsprechende Konstante erhalten Environment. Hierfür gibt es mehrere Möglichkeiten. Und alle erfordern eine Verbesserung im enumUnterricht selbst. Option 1. Aufzählung innerhalb der Klasse. Sie müssen eine Methode erstellen, die eine Zeichenfolge akzeptiert und diese mit allen Werten enumder Klasse vergleicht. Bei einer Übereinstimmung gibt die Methode die gewünschte Aufzählung zurück. Für unser Beispiel müssen wir Environmentdie folgende Methode innerhalb der Klasse erstellen:
public static Environment getEnvByUrl(String url) {
    for (Environment env : values()) {
        // либо equalsIgnoreCase, на ваше усмотрение
        if (env.getUrl().equals(url)) {
            return env;
        }
    }

    // Либо просто вернуть null
    throw new IllegalArgumentException("No enum found with url: [" + url + "]");
}
enumDann können wir aus der Zeichenfolge Folgendes erhalten :
public class Main {
    public static void main(String[] args) {
        String url = "http://localhost:8080";
        Environment env = Environment.getEnvByUrl(url);

        System.out.println("Environment name for url=[" + url + "] is: " + env);
    }
}
Abschluss:

Environment name for url=[http://localhost:8080] is: DEV
Dieser Ansatz hat seine Nachteile. enumUm eine Konstante zu erhalten, müssen Sie jedes Mal alle Werte durchlaufen und eine bestimmte Anzahl von Vergleichen durchführen. Die Leistungseinbuße wird in diesem Fall durch die Anzahl der Konstanten und die Anzahl ähnlicher Operationen bestimmt. Bei der zweiten Methode zur Lösung dieses Problems tritt dieses Problem nicht auf. Vollständiger EnumKlassencode:
public enum Environment {

    PROD("https://release.application.com/"),
    TEST("https://test.application.com/"),
    AUTO_TEST("https://autotest.application.com/"),
    DEV("http://localhost:8080");

    private final String url;

    Environment(String url) {
        this.url = url;
    }

    public String getUrl() {
        return url;
    }

    public static Environment getEnvByUrl(String url) {
        for (Environment env : values()) {
            if (env.getUrl().equals(url)) {
                return env;
            }
        }
        throw new IllegalArgumentException("No enum found with url: [" + url + "]");
    }
}
Option 2: Verwendung HashMap In diesem Fall erstellen wir eine Karte innerhalb unserer Enumeration, füllen sie einmal zur Kompilierungszeit und übernehmen dann die Werte daraus:
public enum Environment {

    PROD("https://release.application.com/"),
    TEST("https://test.application.com/"),
    AUTO_TEST("https://autotest.application.com/"),
    DEV("http://localhost:8080");

    private final String url;

    Environment(String url) {
        this.url = url;
    }

    public String getUrl() {
        return url;
    }

    // Создаем static final карту
    private static final Map<String, Environment> LOOKUP_MAP = new HashMap<>();

    // Заполняем её всеми значениями
    static {
        for (Environment env : values()) {
            LOOKUP_MAP.put(env.getUrl(), env);
        }
    }

    // Возвращаем Environment по строковому url
    public static Environment getEnvByUrl(String url) {
        return LOOKUP_MAP.get(url);
    }
}
Von der Nutzung her sind beide Möglichkeiten identisch:
public class Main {
    public static void main(String[] args) {
        String url = "http://localhost:8080";
        Environment env = Environment.getEnvByUrl(url);

        System.out.println("Environment name for url=[" + url + "] is: " + env);
    }
}
Abschluss:

Environment name for url=[http://localhost:8080] is: DEV
Doch diese Methode hat auch Nachteile. Erstens gibt es viel mehr Code. Und zweitens werden HashMapalle enumWerte dauerhaft im Anwendungsspeicher gespeichert. Wie Sie sehen, hat alles Vor- und Nachteile. Aber wenn man bedenkt, dass enumKlassen normalerweise nicht so viele Werte speichern, werden die Nachteile fast unsichtbar sein. Es gibt einen Vorbehalt: Wenn ein solcher Vorgang (Abrufen eines Java-Enum-by-String-Werts) häufig ausgeführt wird, ist es besser, die zweite Option zu verwenden. Mehr über dieses Thema und EnumKlassen im Allgemeinen erfahren Sie im JavaRush-Kurs. Studierende erlernen JavaRush Enumbereits in der ersten Vorlesung der fünften Stufe . Konvertieren von Enum in String - 2
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION