JavaRush /Java Blog /Random-ID /Mengonversi Enum ke String

Mengonversi Enum ke String

Dipublikasikan di grup Random-ID
Hari ini kita akan berbicara tentang bekerja dengan enumerasi string, dan lebih khusus lagi, dengan enumkelas yang mengatur interaksi dengan konstanta string. Mengonversi Enum ke String - 1

Menggunakan Enumerasi String

Selama pengembangan aplikasi, Anda secara berkala perlu mengoperasikan sekumpulan nilai string yang tetap. Itu bisa berupa apa saja. Misalnya, daftar kode warna yang didukung oleh aplikasi, atau daftar perangkat yang dapat berinteraksi dengan aplikasi kita, musim, dll. Semua ini adalah kumpulan konstanta string yang telah ditentukan sebelumnya dengan struktur umum yang diperlukan untuk membangun interaksi program pada tingkat kode Java. Saat Anda perlu berinteraksi dengan sekumpulan konstanta string (dan lainnya) yang telah ditentukan sebelumnya, solusi terbaik adalah dengan menulis enumkelas Anda sendiri. Di bawah ini kita akan melihat contoh konversi enumke string.

Membuat Enumerasi String

Mari buat enumkelas yang menyimpan daftar lingkungan berbeda untuk menyebarkan aplikasi, serta URL setiap lingkungan:
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;
    }
}
Di kelas ini kami telah mendefinisikan 4 lingkungan:
  • PROD- melepaskan
  • TEST— untuk pengujian manual
  • AUTO_TEST— lingkungan untuk tes otomatis
  • DEV— lokal untuk pengembangan dan debugging
Dan juga 4 URL untuk masing-masing lingkungan ini. Mari kita perhatikan beberapa poin penting.
  1. Setiap URL adalah konstanta string dalam enumerasi kami: URL tersebut didefinisikan dalam tanda kurung di samping setiap enumkonstanta.
  2. Harus ada konstruktor yang mengambil argumen dengan tipe yang sama dengan setiap enumkonstanta.
  3. Ruang lingkup konstruktornya privateadalah package private.
  4. Penting untuk mendefinisikan variabel - bidang kelas yang akan menyimpan konstanta string yang telah kita definisikan. Anda harus membuat metode pengambil untuk bidang ini agar dapat menggunakan nilai konstanta string secara eksternal.

Iterasi pada enumerasi string

Pada tahap ini, kita sudah dapat mengulangi semua enumnilai yang tersedia, serta mendapatkan konstanta string yang terkait dengannya. Untuk mendapatkan semua nilai enumkelas mana pun, Anda perlu menggunakan metode values():
public class Main {
    public static void main(String[] args) {
        for (Environment env : Environment.values()) {
            System.out.println(env + " : " + env.getUrl());
        }
    }
}
Kesimpulan:

PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
Seperti dapat dilihat dari contoh, untuk mencetak nama enumkonstanta, kami meneruskannya ke metode System.out.println, dan untuk mencetak url yang terkait dengan konstanta ini, kami menggunakan pengambil yang kami tentukan.

Mendapatkan konstanta string dari enum

Untuk mendapatkan nilai konstanta string apa pun, kita juga dapat memanggil pengambil enumkonstanta apa pun:
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);

    }
}
Kesimpulan:

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

Mendapatkan enum konstan berdasarkan nama

Terkadang perlu untuk mendapatkan enumkonstanta berdasarkan nama stringnya. Hal ini dilakukan dengan menggunakan metode valueOf(String)yang mengembalikan konstanta berdasarkan namanya:
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());

    }
}
Kesimpulan:

Production url is: https://release.application.com/
Development url is: http://localhost:8080
Namun kehati-hatian diperlukan di sini. Jika metode tidak menemukan enumkonstanta dengan nama yang ditentukan, pengecualian akan diberikan java.lang.IllegalArgumentException.

Mengonversi String ke Enum

Terkadang kebutuhan sebaliknya muncul. Mengetahui nilainya enum, dapatkan enumkonstanta itu sendiri. Itu. dalam contoh kita, mengetahui alamat tertentu, Anda perlu mendapatkan Environmentkonstanta yang sesuai. Ada beberapa pilihan untuk melakukan hal ini. Dan semuanya memerlukan perbaikan di enumkelas itu sendiri. Pilihan 1. Pencacahan di dalam kelas. Anda perlu membuat metode yang akan menerima string dan membandingkannya dengan semua nilai enumkelas. Jika ada kecocokan, metode akan mengembalikan enumerasi yang diinginkan. Sebagai contoh, kita perlu Environmentmembuat metode berikut di dalam kelas:
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 + "]");
}
Kemudian kita bisa mendapatkan enumdari string seperti ini:
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);
    }
}
Kesimpulan:

Environment name for url=[http://localhost:8080] is: DEV
Pendekatan ini memiliki kelemahan. Setiap kali, untuk mendapatkan enumkonstanta, Anda harus mengulangi semua nilai dan membuat sejumlah perbandingan. Penalti kinerja dalam hal ini akan ditentukan oleh jumlah konstanta dan jumlah operasi serupa. Metode kedua untuk menyelesaikan masalah ini tidak memiliki masalah ini. EnumKode kelas lengkap :
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 + "]");
    }
}
Opsi 2: Penggunaan HashMap Dalam hal ini, kami membuat peta di dalam enum kami dan mengisinya satu kali pada waktu kompilasi, lalu mengambil nilainya darinya:
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);
    }
}
Dalam hal penggunaan, kedua opsi tersebut identik:
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);
    }
}
Kesimpulan:

Environment name for url=[http://localhost:8080] is: DEV
Namun cara ini juga memiliki kelemahan. Pertama, ada lebih banyak kode. Dan kedua, HashMapsemua enumnilai akan disimpan di memori aplikasi secara permanen. Seperti yang Anda lihat, segala sesuatu memiliki pro dan kontra. Namun mengingat enumkelas biasanya tidak menyimpan banyak nilai, kerugiannya hampir tidak terlihat. Ada peringatan: jika operasi seperti itu (mendapatkan Java Enum berdasarkan nilai String) sering dilakukan, lebih baik menggunakan opsi kedua. Anda dapat mempelajari lebih lanjut tentang topik ini dan Enumkelas-kelas secara umum di kursus JavaRush. Siswa Enumsudah mempelajari JavaRush pada kuliah pertama tingkat kelima . Mengonversi Enum ke String - 2
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION