JavaRush /Java Blogu /Random-AZ /Enumun sətirə çevrilməsi

Enumun sətirə çevrilməsi

Qrupda dərc edilmişdir
enumBu gün biz sətir nömrələri ilə, daha dəqiq desək, sətir sabitləri ilə qarşılıqlı əlaqəni təşkil edən siniflərlə işləmək haqqında danışacağıq .Enumun sətirə çevrilməsi - 1

String Enumerations istifadə

Tətbiqin inkişafı zamanı siz vaxtaşırı sabit sətir dəyərləri dəsti üzərində işləməlisiniz. Hər şey ola bilər. Məsələn, proqram tərəfindən dəstəklənən rəng kodlarının siyahısı və ya tətbiqimizin qarşılıqlı əlaqədə ola biləcəyi cihazların siyahısı, fəsillər və s. Bütün bunlar, Java kodu səviyyəsində proqram qarşılıqlı əlaqəsini qurmaq lazım olan ümumi bir quruluşa malik olan əvvəlcədən təyin edilmiş sətir sabitləri dəstidir. Əvvəlcədən təyin edilmiş sətir (və digər) sabitlər dəsti ilə qarşılıqlı əlaqə yaratmağınız lazım olduqda, ən yaxşı həll öz sinfinizi yazmaqdır enum. enumAşağıda çevrilmə nümunələrinə baxacağıq string.

Simli nömrələrin yaradılması

enumTətbiqin yerləşdirilməsi üçün müxtəlif mühitlərin siyahısını, eləcə də hər bir mühitin URL-sini saxlayan sinif yaradaq :
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;
    }
}
Bu sinifdə biz 4 mühit müəyyən etdik:
  • PROD- buraxılış
  • TEST- əllə sınaq üçün
  • AUTO_TEST— avtotestlər üçün mühit
  • DEV— inkişaf və sazlama üçün yerli
Həm də bu mühitlərin hər biri üçün 4 URL. Bəzi vacib məqamlara diqqət yetirək.
  1. Hər bir URL bizim siyahımızda sətir sabitidir: onlar hər bir enumsabitin yanında mötərizədə müəyyən edilir.
  2. Hər bir sabitlə eyni tipli arqument götürən konstruktor olmalıdır enum.
  3. Konstruktorun əhatə dairəsi privateyadır package private.
  4. Dəyişən müəyyən etmək lazımdır - müəyyən etdiyimiz sətir sabitlərini saxlayacaq sinif sahəsi. Sətir sabitlərinin dəyərlərindən xaricdən istifadə etmək üçün bu sahə üçün alıcı metodu yaratmalısınız.

Sətir nömrələri üzərində təkrarlama

Bu mərhələdə biz artıq bütün mövcud enumdəyərləri təkrarlaya, həmçinin onlarla əlaqəli sətir sabitlərini əldə edə bilərik. İstənilən sinifin bütün dəyərlərini əldə etmək üçün enummetoddan istifadə etməlisiniz values():
public class Main {
    public static void main(String[] args) {
        for (Environment env : Environment.values()) {
            System.out.println(env + " : " + env.getUrl());
        }
    }
}
Nəticə:

PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
Nümunədən göründüyü kimi, enumsabitin adını çap etmək üçün onu metoda System.out.println, bu sabitlə əlaqəli url-i çap etmək üçün isə müəyyən etdiyimiz getterdən istifadə etdik.

Enumdan sətir sabitinin alınması

İstənilən sətir sabitinin qiymətini əldə etmək üçün istənilən sabitdə alıcı çağıra bilərik 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);

    }
}
Nəticə:

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

Adla nömrə sabitinin alınması

enumBəzən sətir adı ilə sabiti almaq lazımdır . valueOf(String)Bu , adı ilə sabiti qaytaran metoddan istifadə etməklə edilir :
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());

    }
}
Nəticə:

Production url is: https://release.application.com/
Development url is: http://localhost:8080
Ancaq burada ehtiyatlı olmaq lazımdır. Metod göstərilən adla sabit tapmasa enum, istisna atılacaq java.lang.IllegalArgumentException.

Sətirin Enum-a çevrilməsi

Bəzən əks ehtiyac yaranır. Dəyərini bilməklə enum, enumsabitin özünü əldə edin. Bunlar. nümunəmizdə müəyyən bir ünvanı bilməklə müvafiq Environmentsabiti əldə etməlisiniz. Bunu etmək üçün bir neçə variant var. Və onların hamısı enumsinfin özündə təkmilləşdirmə tələb edir. Seçim 1. Sinif daxilində siyahıyaalma. enumBir sətri qəbul edəcək və onu sinfin bütün dəyərləri ilə müqayisə edəcək bir üsul yaratmalısınız . Uyğunluq varsa, metod istədiyiniz nömrəni qaytaracaq. Məsələn, biz Environmentsinif daxilində aşağıdakı metodu yaratmalıyıq:
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 + "]");
}
enumSonra sətirdən belə əldə edə bilərik :
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);
    }
}
Nəticə:

Environment name for url=[http://localhost:8080] is: DEV
Bu yanaşmanın mənfi cəhətləri var. Hər dəfə enumbir sabit əldə etmək üçün bütün dəyərləri təkrarlamalı və müəyyən sayda müqayisə etməli olacaqsınız. Bu halda icra cəzası sabitlərin sayı və oxşar əməliyyatların sayı ilə müəyyən ediləcək. Bu problemi həll etməyin ikinci üsulunda bu problem yoxdur. Tam Enumsinif kodu:
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 + "]");
    }
}
Seçim 2: İstifadə HashMap Bu halda, biz öz nömrəmizin daxilində bir xəritə yaradırıq və onu tərtib zamanı bir dəfə doldururuq və sonra dəyərləri oradan götürürük:
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);
    }
}
İstifadə baxımından hər iki seçim eynidir:
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);
    }
}
Nəticə:

Environment name for url=[http://localhost:8080] is: DEV
Ancaq bu metodun mənfi cəhətləri də var. Birincisi, daha çox kod var. İkincisi, HashMapbütün enumdəyərlər proqram yaddaşında qalıcı olaraq saxlanılacaq. Gördüyünüz kimi, hər şeyin müsbət və mənfi tərəfləri var. Ancaq siniflərin adətən o qədər də çox dəyər saxlamadığını nəzərə alsaq enum, çatışmazlıqlar demək olar ki, görünməz olacaqdır. Bir xəbərdarlıq var: belə bir əməliyyat (String dəyəri ilə Java Enum əldə etmək) tez-tez həyata keçirilirsə, ikinci variantdan istifadə etmək daha yaxşıdır. EnumJavaRush kursunda bu mövzu və ümumilikdə dərslər haqqında daha çox məlumat əldə edə bilərsiniz. Tələbələr JavaRush-u Enumartıq beşinci səviyyənin ilk mühazirəsində öyrənirlər . Enumun sətirə çevrilməsi - 2
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION