JavaRush /Java blogi /Random-UZ /Enumni stringga aylantirish

Enumni stringga aylantirish

Guruhda nashr etilgan
Bugun biz satr raqamlari bilan, aniqrog'i, enumsatr konstantalari bilan o'zaro aloqani tashkil qiluvchi sinflar bilan ishlash haqida gaplashamiz. Enumni stringga aylantirish - 1

String sanablaridan foydalanish

Ilovalarni ishlab chiqishda siz vaqti-vaqti bilan belgilangan qator qiymatlari to'plamida ishlashingiz kerak bo'ladi. Bu har qanday narsa bo'lishi mumkin. Masalan, ilova tomonidan qo'llab-quvvatlanadigan rang kodlari ro'yxati yoki ilovamiz o'zaro aloqada bo'lishi mumkin bo'lgan qurilmalar ro'yxati, fasllar va boshqalar. Bularning barchasi umumiy tuzilishga ega bo'lgan oldindan belgilangan qator konstantalari to'plami bo'lib, ular bilan Java kodlari darajasida dasturning o'zaro ta'sirini o'rnatish kerak. Oldindan belgilangan qator (va boshqa) konstantalar bilan o'zaro aloqada bo'lishingiz kerak bo'lganda, eng yaxshi yechim o'z sinfingizni yozishdir enum. enumQuyida biz ga aylantirish misollarini ko'rib chiqamiz string.

String sanablarini yaratish

Keling, enumilovani joylashtirish uchun turli muhitlar roʻyxatini hamda har bir muhitning URL manzilini saqlaydigan sinf yarataylik:
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;
    }
}
Ushbu sinfda biz 4 ta muhitni aniqladik:
  • PROD- ozod qilish
  • TEST- qo'lda sinov uchun
  • AUTO_TEST— avtotestlar uchun muhit
  • DEV— ishlab chiqish va disk raskadrovka uchun mahalliy
Shuningdek, ushbu muhitlarning har biri uchun 4 ta URL. Keling, ba'zi muhim fikrlarga e'tibor qarataylik.
  1. Har bir URL bizning sanabimizdagi satr konstantasidir: ular har bir enumkonstantaning yonidagi qavslar ichida aniqlanadi.
  2. Har bir konstanta bilan bir xil turdagi argumentni oladigan konstruktor bo'lishi kerak enum.
  3. Konstruktor doirasi privateyoki package private.
  4. O'zgaruvchini aniqlash kerak - biz aniqlagan satr konstantalarini saqlaydigan sinf maydoni. Satr konstantalarining qiymatlaridan tashqarida foydalanish uchun ushbu maydon uchun getter usulini yaratishingiz kerak.

Satr sanablarini takrorlash

Ushbu bosqichda biz allaqachon barcha mavjud qiymatlarni takrorlashimiz enum, shuningdek ular bilan bog'langan satr konstantalarini olishimiz mumkin. Har qanday sinfning barcha qiymatlarini olish uchun enumsiz quyidagi usuldan foydalanishingiz kerak values():
public class Main {
    public static void main(String[] args) {
        for (Environment env : Environment.values()) {
            System.out.println(env + " : " + env.getUrl());
        }
    }
}
Xulosa:

PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
Misoldan ko'rinib turibdiki, enumkonstanta nomini chop etish uchun uni usuliga o'tkazdik System.out.printlnva bu konstanta bilan bog'langan urlni chop etish uchun biz aniqlagan getterdan foydalandik.

Enum dan satr konstantasini olish

Har qanday satr konstantasining qiymatini olish uchun har qanday konstantada getterni ham chaqirishimiz mumkin enum:
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);

    }
}
Xulosa:

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

Nomi bo'yicha raqam konstantasini olish

enumBa'zan satr nomi bo'yicha doimiyni olish kerak bo'ladi . valueOf(String)Bu o'z nomi bilan doimiyni qaytaradigan usul yordamida amalga oshiriladi :
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());

    }
}
Xulosa:

Production url is: https://release.application.com/
Development url is: http://localhost:8080
Ammo bu erda ehtiyot bo'lish kerak. Agar usul ko'rsatilgan nomga ega doimiyni topmasa enum, istisno chiqariladi java.lang.IllegalArgumentException.

Stringni Enumga aylantirish

Ba'zida qarama-qarshi ehtiyoj paydo bo'ladi. Qiymatni bilib enum, enumdoimiyning o'zini oling. Bular. bizning misolimizda ma'lum bir manzilni bilib, siz mos keladigan Environmentdoimiyni olishingiz kerak. Buning uchun bir nechta variant mavjud. Va ularning barchasi enumsinfning o'zida yaxshilanishni talab qiladi. Variant 1. Sinf ichidagi ro'yxatga olish. Siz satrni qabul qiladigan va uni enumsinfning barcha qiymatlari bilan taqqoslaydigan usulni yaratishingiz kerak. Agar mos keladigan bo'lsa, usul kerakli raqamni qaytaradi. EnvironmentBizning misolimiz uchun sinf ichida quyidagi usulni yaratishimiz kerak :
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 + "]");
}
enumKeyin biz satrdan shunday olamiz :
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);
    }
}
Xulosa:

Environment name for url=[http://localhost:8080] is: DEV
Ushbu yondashuv o'zining salbiy tomonlariga ega. Har safar enumdoimiy qiymatni olish uchun siz barcha qiymatlarni takrorlashingiz va ma'lum miqdordagi taqqoslashni amalga oshirishingiz kerak bo'ladi. Bu holatda ishlash jazosi doimiylar soni va shunga o'xshash operatsiyalar soni bilan belgilanadi. Ushbu muammoni hal qilishning ikkinchi usuli bu muammoga ega emas. To'liq Enumsinf kodi:
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 + "]");
    }
}
Variant 2: Foydalanish HashMap Bunday holda, biz raqamimiz ichida xarita yaratamiz va uni kompilyatsiya vaqtida bir marta to'ldiramiz va undan qiymatlarni olamiz:
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);
    }
}
Foydalanish nuqtai nazaridan ikkala variant ham bir xil:
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);
    }
}
Xulosa:

Environment name for url=[http://localhost:8080] is: DEV
Ammo bu usulning ham kamchiliklari bor. Birinchidan, juda ko'p kod mavjud. Ikkinchidan, HashMapbarcha enumqiymatlar doimiy ravishda dastur xotirasida saqlanadi. Ko'rib turganingizdek, hamma narsaning ijobiy va salbiy tomonlari bor. Ammo sinflar odatda unchalik ko'p qiymatlarni saqlamasligini hisobga olsak enum, kamchiliklar deyarli ko'rinmas bo'ladi. Ogohlantirish bor: agar bunday operatsiya (String qiymati bo'yicha Java Enum olish) tez-tez bajarilsa, ikkinchi variantni qo'llash yaxshidir. EnumJavaRush kursida ushbu mavzu va umuman darslar haqida ko'proq ma'lumot olishingiz mumkin. Talabalar JavaRush-ni beshinchi darajadagi birinchi ma'ruzadaEnum o'rganadilar . Enumni stringga aylantirish - 2
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION