Heute sprechen wir über die Arbeit mit String-Aufzählungen und insbesondere über
enum
Klassen, die die Interaktion mit String-Konstanten organisieren.
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 eigeneenum
Klasse zu schreiben. Nachfolgend sehen wir uns Beispiele für die Konvertierung enum
an string
.
String-Aufzählungen erstellen
Erstellen wirenum
eine 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
- freigebenTEST
— für manuelle TestsAUTO_TEST
— Umgebung für AutotestsDEV
– lokal für Entwicklung und Debugging
- Jede URL ist eine String-Konstante in unserer Aufzählung: Sie wird in Klammern neben jeder
enum
Konstante definiert. - Es muss einen Konstruktor geben, der als jede Konstante ein Argument desselben Typs akzeptiert
enum
. - Der Gültigkeitsbereich des Konstruktors ist
private
entwederpackage private
. - 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 iterierenenum
und ihnen zugeordnete String-Konstanten abrufen. Um alle Werte einer beliebigen enum
Klasse 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 enum
wir 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 jedeenum
Konstante 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
enum
Manchmal 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 kennenenum
, erhalten Sie enum
die 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 enum
Unterricht selbst. Option 1. Aufzählung innerhalb der Klasse. Sie müssen eine Methode erstellen, die eine Zeichenfolge akzeptiert und diese mit allen Werten enum
der Klasse vergleicht. Bei einer Übereinstimmung gibt die Methode die gewünschte Aufzählung zurück. Für unser Beispiel müssen wir Environment
die 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 + "]");
}
enum
Dann 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. enum
Um 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 Enum
Klassencode:
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 HashMap
alle enum
Werte dauerhaft im Anwendungsspeicher gespeichert. Wie Sie sehen, hat alles Vor- und Nachteile. Aber wenn man bedenkt, dass enum
Klassen 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 Enum
Klassen im Allgemeinen erfahren Sie im JavaRush-Kurs. Studierende erlernen JavaRush Enum
bereits in der ersten Vorlesung der fünften Stufe .
GO TO FULL VERSION