JavaRush /Java Blog /Random-IT /Conversione di Enum in String

Conversione di Enum in String

Pubblicato nel gruppo Random-IT
Oggi parleremo di come lavorare con le enumerazioni di stringhe e, più specificamente, di enumclassi che organizzano l'interazione con costanti di stringa. Conversione di Enum in String - 1

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 propria enumclasse. Di seguito vedremo esempi di conversione enumin string.

Creazione di enumerazioni di stringhe

Creiamo enumuna 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- pubblicazione
  • TEST— per test manuali
  • AUTO_TEST— ambiente per gli autotest
  • DEV— locale per lo sviluppo e il debug
E anche 4 URL per ciascuno di questi ambienti. Prestiamo attenzione ad alcuni punti importanti.
  1. Ogni URL è una costante stringa nella nostra enumerazione: sono definiti tra parentesi accanto a ciascuna enumcostante.
  2. Deve esserci un costruttore che accetta un argomento dello stesso tipo di ciascuna enumcostante.
  3. L'ambito del costruttore privateè package private.
  4. È 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 tutti enumi valori disponibili, nonché ottenere costanti di stringa ad essi associati. Per ottenere tutti i valori di qualsiasi enumclasse, è 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 enumcostante 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 qualsiasi enumcostante:
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 ottenere enumuna 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 enumuna 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 valore enum, ottieni enumla costante stessa. Quelli. nel nostro esempio, conoscendo un determinato indirizzo, è necessario ottenere la Environmentcostante corrispondente. Ci sono diverse opzioni per farlo. E tutti richiedono miglioramenti nella enumclasse stessa. Opzione 1. Enumerazione all'interno della classe. Devi creare un metodo che accetti una stringa e la confronti con tutti i valori enumdella classe. Se esiste una corrispondenza, il metodo restituirà l'enumerazione desiderata. Per il nostro esempio, dobbiamo Environmentcreare 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 enumdalla 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 enumuna 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, HashMaptutti enumi valori verranno archiviati in modo permanente nella memoria dell'applicazione. Come puoi vedere, tutto ha pro e contro. Ma considerando che enumle 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 Enumsulle lezioni in generale nel corso JavaRush. Gli studenti imparano JavaRush Enumgià alla prima lezione del quinto livello . Conversione di Enum in String - 2
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION