JavaRush /Blog Java /Random-MS /Menukar Enum kepada String

Menukar Enum kepada String

Diterbitkan dalam kumpulan
Hari ini kita akan bercakap tentang bekerja dengan penghitungan rentetan, dan lebih khusus lagi, dengan enumkelas yang mengatur interaksi dengan pemalar rentetan. Menukar Enum kepada Rentetan - 1

Menggunakan Penghitungan Rentetan

Semasa pembangunan aplikasi, anda perlu beroperasi secara berkala pada set tetap nilai rentetan. Ia boleh jadi apa sahaja. Contohnya, senarai kod warna yang disokong oleh aplikasi, atau senarai peranti yang boleh digunakan oleh aplikasi kami, musim, dsb. Semua ini adalah set pemalar rentetan yang telah ditetapkan dengan struktur yang sama, yang dengannya perlu untuk mewujudkan interaksi program pada tahap kod Java. Apabila anda perlu berinteraksi dengan set pemalar rentetan (dan lain-lain) yang telah ditetapkan, penyelesaian terbaik ialah menulis enumkelas anda sendiri. Di bawah ini kita akan melihat contoh penukaran enumkepada string.

Mencipta Penghitungan Rentetan

Mari buat enumkelas yang menyimpan senarai persekitaran yang berbeza untuk menggunakan aplikasi, serta URL bagi setiap persekitaran:
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;
    }
}
Dalam kelas ini kami telah menentukan 4 persekitaran:
  • PROD- lepaskan
  • TEST- untuk ujian manual
  • AUTO_TEST— persekitaran untuk autotest
  • DEV— tempatan untuk pembangunan dan penyahpepijatan
Dan juga 4 URL untuk setiap persekitaran ini. Mari kita perhatikan beberapa perkara penting.
  1. Setiap URL ialah pemalar rentetan dalam penghitungan kami: ia ditakrifkan dalam kurungan bersebelahan dengan setiap enumpemalar.
  2. Mesti ada pembina yang mengambil hujah dari jenis yang sama seperti setiap enumpemalar.
  3. Skop pembina adalah privatesama ada package private.
  4. Ia adalah perlu untuk menentukan pembolehubah - medan kelas yang akan menyimpan pemalar rentetan yang telah kami tentukan. Anda mesti mencipta kaedah pengambil untuk medan ini untuk menggunakan nilai pemalar rentetan secara luaran.

Mengulangi penghitungan rentetan

Pada peringkat ini, kita sudah boleh mengulangi semua enumnilai yang tersedia, serta mendapatkan pemalar rentetan yang dikaitkan dengannya. Untuk mendapatkan semua nilai mana-mana enumkelas, anda perlu menggunakan kaedah 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 yang dapat dilihat daripada contoh, untuk mencetak nama enumpemalar, kami menyerahkannya kepada kaedah System.out.println, dan untuk mencetak url yang dikaitkan dengan pemalar ini, kami menggunakan pengambil yang kami tentukan.

Mendapat pemalar rentetan daripada enum

Untuk mendapatkan nilai sebarang pemalar rentetan, kita juga boleh memanggil pengambil pada sebarang enumpemalar:
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

Mendapat pemalar enum mengikut nama

Kadang-kadang perlu untuk mendapatkan enumpemalar dengan nama rentetannya. Ini dilakukan menggunakan kaedah valueOf(String), yang mengembalikan pemalar dengan 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
Tetapi berhati-hati diperlukan di sini. Jika kaedah tidak menemui enumpemalar dengan nama yang ditentukan, pengecualian akan dilemparkan java.lang.IllegalArgumentException.

Menukar String kepada Enum

Kadangkala keperluan sebaliknya timbul. Mengetahui nilai enum, dapatkan enumpemalar itu sendiri. Itu. dalam contoh kami, mengetahui alamat tertentu, anda perlu mendapatkan Environmentpemalar yang sepadan. Terdapat beberapa pilihan untuk melakukan ini. Dan kesemuanya memerlukan peningkatan dalam enumkelas itu sendiri. Pilihan 1. Penghitungan di dalam kelas. Anda perlu mencipta kaedah yang akan menerima rentetan dan membandingkannya dengan semua nilai enumkelas. Sekiranya terdapat padanan, kaedah akan mengembalikan penghitungan yang dikehendaki. Untuk contoh kami, kami perlu Environmentmencipta kaedah 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 boleh mendapatkan enumdari rentetan 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 mempunyai kelemahannya. Setiap kali, untuk mendapatkan enumpemalar, anda perlu mengulangi semua nilai dan membuat beberapa perbandingan. Penalti prestasi dalam kes ini akan ditentukan oleh bilangan pemalar dan bilangan operasi yang serupa. Kaedah kedua untuk menyelesaikan masalah ini tidak mempunyai masalah ini. EnumKod kelas penuh :
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 + "]");
    }
}
Pilihan 2: Penggunaan HashMap Dalam kes ini, kami mencipta peta di dalam enum kami dan mengisinya sekali pada masa penyusunan, dan kemudian mengambil nilai daripadanya:
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);
    }
}
Dari segi penggunaan, kedua-dua pilihan adalah sama:
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
Tetapi kaedah ini juga mempunyai kelemahan. Pertama, terdapat lebih banyak kod. Dan kedua, HashMapsemua enumnilai akan disimpan dalam memori aplikasi secara kekal. Seperti yang anda lihat, semuanya mempunyai kebaikan dan keburukan. Tetapi memandangkan enumkelas biasanya menyimpan tidak begitu banyak nilai, keburukan akan hampir tidak dapat dilihat. Terdapat kaveat: jika operasi sedemikian (mendapatkan Java Enum oleh nilai String) dilakukan dengan kerap, lebih baik menggunakan pilihan kedua. Anda boleh mengetahui lebih lanjut tentang topik dan Enumkelas ini secara umum dalam kursus JavaRush. Pelajar Enumsudah mempelajari JavaRush pada kuliah pertama tahap kelima . Menukar Enum kepada Rentetan - 2
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION