Oggi parleremo di come lavorare con le enumerazioni di stringhe e, più specificamente, di
enum
classi che organizzano l'interazione con costanti di stringa.
Utilizzo delle enumerazioni di stringhe
Durante lo sviluppo dell'applicazione è necessario operare periodicamente su un insieme fisso di valori stringa. Potrebbe essere qualsiasi cosa. Ad esempio, un elenco di codici colore supportati dall'applicazione, oppure un elenco di dispositivi con cui la nostra applicazione può interagire, stagioni, ecc. Tutto questo è un insieme predefinito di costanti stringa con una struttura comune, con la quale è necessario stabilire l'interazione del programma a livello di codice Java. Quando è necessario interagire con un insieme predefinito di costanti di stringa (e altre), la soluzione migliore è scrivere la propriaenum
classe. Di seguito vedremo esempi di conversione enum
in string
.
Creazione di enumerazioni di stringhe
Creiamoenum
una classe che memorizza un elenco di diversi ambienti per la distribuzione dell'applicazione, nonché l'URL di ciascun ambiente:
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 questa classe abbiamo definito 4 ambienti:
PROD
- pubblicazioneTEST
— per test manualiAUTO_TEST
— ambiente per gli autotestDEV
— locale per lo sviluppo e il debug
- Ogni URL è una costante stringa nella nostra enumerazione: sono definiti tra parentesi accanto a ciascuna
enum
costante. - Deve esserci un costruttore che accetta un argomento dello stesso tipo di ciascuna
enum
costante. - L'ambito del costruttore
private
èpackage private
. - È necessario definire una variabile, un campo di classe che memorizzerà le costanti di stringa che abbiamo definito. È necessario creare un metodo getter per questo campo per utilizzare esternamente i valori delle costanti stringa.
Iterazione su enumerazioni di stringhe
A questo punto, possiamo già eseguire l'iterazione su tuttienum
i valori disponibili, nonché ottenere costanti di stringa ad essi associati. Per ottenere tutti i valori di qualsiasi enum
classe, è necessario utilizzare il metodo values()
:
public class Main {
public static void main(String[] args) {
for (Environment env : Environment.values()) {
System.out.println(env + " : " + env.getUrl());
}
}
}
Conclusione:
PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
Come si può vedere dall'esempio, per stampare il nome della enum
costante lo abbiamo passato al metodo System.out.println
, e per stampare l'url associato a questa costante abbiamo utilizzato il getter da noi definito.
Ottenere una costante di stringa da enum
Per ottenere il valore di qualsiasi costante di stringa, possiamo anche chiamare un getter su qualsiasienum
costante:
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);
}
}
Conclusione:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Ottenere la costante enum per nome
A volte è necessario ottenereenum
una costante tramite il nome della stringa. Questo viene fatto utilizzando il metodo valueOf(String)
, che restituisce una costante con il suo nome:
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());
}
}
Conclusione:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Ma qui è necessaria cautela. Se il metodo non trova enum
una costante con il nome specificato, verrà lanciata un'eccezione java.lang.IllegalArgumentException
.
Conversione di stringa in enum
A volte si presenta l'esigenza opposta. Conoscendo il valoreenum
, ottieni enum
la costante stessa. Quelli. nel nostro esempio, conoscendo un determinato indirizzo, è necessario ottenere la Environment
costante corrispondente. Ci sono diverse opzioni per farlo. E tutti richiedono miglioramenti nella enum
classe stessa. Opzione 1. Enumerazione all'interno della classe. Devi creare un metodo che accetti una stringa e la confronti con tutti i valori enum
della classe. Se esiste una corrispondenza, il metodo restituirà l'enumerazione desiderata. Per il nostro esempio, dobbiamo Environment
creare il seguente metodo all'interno della classe:
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 + "]");
}
Quindi possiamo ottenere enum
dalla stringa in questo modo:
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);
}
}
Conclusione:
Environment name for url=[http://localhost:8080] is: DEV
Questo approccio ha i suoi svantaggi. Ogni volta, per ottenere enum
una costante, dovrai scorrere tutti i valori ed effettuare un certo numero di confronti. La penalità prestazionale in questo caso sarà determinata dal numero di costanti e dal numero di operazioni simili. Il secondo metodo per risolvere questo problema non presenta questo problema. Codice corso completo Enum
:
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 + "]");
}
}
Opzione 2: Utilizzo HashMap
In questo caso, creiamo una mappa all'interno della nostra enumerazione e la popoliamo una volta in fase di compilazione, quindi prendiamo i valori da essa:
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);
}
}
In termini di utilizzo, entrambe le opzioni sono identiche:
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);
}
}
Conclusione:
Environment name for url=[http://localhost:8080] is: DEV
Ma questo metodo presenta anche degli svantaggi. Innanzitutto, c'è molto più codice. In secondo luogo, HashMap
tutti enum
i valori verranno archiviati in modo permanente nella memoria dell'applicazione. Come puoi vedere, tutto ha pro e contro. Ma considerando che enum
le classi di solito non memorizzano così tanti valori, gli svantaggi saranno quasi invisibili. C'è un avvertimento: se tale operazione (ottenimento di un valore Java Enum tramite String) viene eseguita frequentemente, è meglio utilizzare la seconda opzione. Puoi saperne di più su questo argomento e Enum
sulle lezioni in generale nel corso JavaRush. Gli studenti imparano JavaRush Enum
già alla prima lezione del quinto livello .
GO TO FULL VERSION