JavaRush /Blog Jawa /Random-JV /Ngonversi Enum menyang String

Ngonversi Enum menyang String

Diterbitake ing grup
Dina iki kita bakal ngomong babagan nggarap enumerasi string, lan luwih khusus, karo enumkelas sing ngatur interaksi karo konstanta string. Ngonversi Enum menyang String - 1

Nggunakake Enumerasi String

Sajrone pangembangan aplikasi, sampeyan kudu ngoperasikake nilai senar kanthi periodik. Bisa wae. Contone, dhaptar kode warna sing didhukung aplikasi, utawa dhaptar piranti sing bisa digunakake kanggo interaksi, musim, lsp. Kabeh iki minangka set konstanta senar sing wis ditemtokake kanthi struktur umum, sing perlu kanggo nggawe interaksi program ing tingkat kode Jawa. Yen sampeyan kudu sesambungan karo set sing wis ditemtokake saka senar (lan liyane) konstanta, solusi sing paling apik kanggo nulis enumkelas dhewe. Ing ngisor iki kita bakal ndeleng conto konversi enummenyang string.

Nggawe Enumerasi String

Ayo nggawe enumkelas sing nyimpen dhaptar lingkungan sing beda kanggo nyebarake aplikasi, uga URL saben 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;
    }
}
Ing kelas iki kita wis nemtokake 4 lingkungan:
  • PROD- release
  • TEST- kanggo testing manual
  • AUTO_TEST- lingkungan kanggo autotests
  • DEV- lokal kanggo pangembangan lan debugging
Lan uga 4 URL kanggo saben lingkungan kasebut. Ayo padha nggatekake sawetara poin penting.
  1. Saben URL minangka konstanta senar ing enumerasi kita: ditetepake ing kurung ing jejere saben enumkonstanta.
  2. Mesthi ana konstruktor sing njupuk argumen saka jinis sing padha karo saben enumkonstanta.
  3. Ruang lingkup konstruktor privateyaiku package private.
  4. Sampeyan kudu nemtokake variabel - lapangan kelas sing bakal nyimpen konstanta senar sing wis ditemtokake. Sampeyan kudu nggawe metode getter kanggo lapangan iki supaya bisa nggunakake nilai konstanta string ing njaba.

Iterasi liwat enumerasi string

Ing tahap iki, kita wis bisa ngulang kabeh enumnilai sing kasedhiya, uga entuk konstanta senar sing ana gandhengane. Kanggo entuk kabeh nilai saka enumkelas apa wae, sampeyan kudu nggunakake 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
Minangka bisa katon saka conto, kanggo print jeneng enumpancet, kita liwati menyang cara System.out.println, lan print url gadhah pancet iki, kita digunakake getter kita ditetepake.

Entuk konstanta senar saka enum

Kanggo entuk nilai konstanta string, kita uga bisa nelpon getter ing enumkonstanta apa wae:
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

Njupuk konstanta enum kanthi jeneng

Kadhangkala perlu kanggo entuk enumkonstanta kanthi jeneng senar. Iki ditindakake kanthi nggunakake metode valueOf(String), sing ngasilake konstanta kanthi jeneng:
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
Nanging ati-ati dibutuhake ing kene. Yen metode kasebut ora nemokake enumkonstanta kanthi jeneng sing ditemtokake, pangecualian bakal dibuwang java.lang.IllegalArgumentException.

Ngonversi String menyang Enum

Kadhangkala kabutuhan ngelawan muncul. Ngerti regane enum, entuk enumkonstanta dhewe. Sing. ing conto kita, ngerti alamat tartamtu, sampeyan kudu njaluk Environmentpancet cocog. Ana sawetara opsi kanggo nindakake iki. Lan kabeh mau mbutuhake perbaikan ing enumkelas kasebut. Pilihan 1. Enumerasi ing njero kelas. Sampeyan kudu nggawe metode sing bakal nampa senar lan mbandhingake karo kabeh nilai enumkelas. Yen ana sing cocog, cara kasebut bakal ngasilake enumerasi sing dikarepake. Contone, kita kudu Environmentnggawe metode ing ngisor iki ing 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 + "]");
}
Banjur kita bisa njaluk enumsaka senar kaya iki:
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 iki nduweni kekurangan. Saben wektu, kanggo entuk enumkonstanta, sampeyan kudu ngulang kabeh nilai lan nggawe sawetara mbandhingake. Penalti kinerja ing kasus iki bakal ditemtokake dening jumlah konstanta lan jumlah operasi sing padha. Cara liya kanggo ngrampungake masalah iki ora duwe masalah iki. 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: Panggunaan HashMap Ing kasus iki, kita nggawe peta ing njero enum lan isi sapisan ing wektu kompilasi, banjur njupuk nilai kasebut:
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);
    }
}
Ing babagan panggunaan, loro opsi kasebut padha:
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
Nanging cara iki uga duwe kekurangan. Kaping pisanan, ana luwih akeh kode. Lan kapindho, HashMapkabeh enumnilai bakal disimpen ing memori aplikasi kanthi permanen. Nalika sampeyan bisa ndeleng, kabeh wis Pros lan cons. Nanging considering sing enumkelas biasane nyimpen ora dadi akeh nilai, cacat bakal meh ora katon. Ana caveat: yen operasi kasebut (entuk nilai Java Enum dening String) asring ditindakake, luwih becik nggunakake pilihan liya. Sampeyan bisa sinau luwih lengkap babagan topik iki lan Enumkelas umume ing kursus JavaRush. Siswa sinau JavaRush Enumwis ing kuliah pisanan ing tingkat lima . Ngonversi Enum menyang String - 2
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION