JavaRush /Java Blog /Random-TL /Pag-convert ng Enum sa String

Pag-convert ng Enum sa String

Nai-publish sa grupo
Ngayon ay pag-uusapan natin ang tungkol sa pagtatrabaho sa mga enumerasyon ng string, at higit na partikular, sa enummga klase na nag-aayos ng pakikipag-ugnayan sa mga string constant. Pag-convert ng Enum sa String - 1

Paggamit ng String Enumerations

Sa panahon ng pagbuo ng application, pana-panahong kailangan mong magpatakbo sa isang nakapirming hanay ng mga halaga ng string. Maaaring kahit ano. Halimbawa, isang listahan ng mga color code na sinusuportahan ng application, o isang listahan ng mga device kung saan maaaring makipag-ugnayan ang aming application, mga season, atbp. Ang lahat ng ito ay isang paunang-natukoy na hanay ng mga string constant na may isang karaniwang istraktura, kung saan kinakailangan upang magtatag ng pakikipag-ugnayan ng programa sa antas ng Java code. Kapag kailangan mong makipag-ugnayan sa isang paunang natukoy na hanay ng mga string (at iba pang) constants, ang pinakamagandang solusyon ay ang pagsulat ng sarili mong enumklase. Sa ibaba ay titingnan natin ang mga halimbawa ng conversion enumsa string.

Paglikha ng String Enumerations

Gumawa tayo enumng klase na nag-iimbak ng listahan ng iba't ibang environment para sa pag-deploy ng application, pati na rin ang URL ng bawat environment:
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;
    }
}
Sa klase na ito, tinukoy namin ang 4 na kapaligiran:
  • PROD- pakawalan
  • TEST- para sa manu-manong pagsubok
  • AUTO_TEST— kapaligiran para sa mga autotest
  • DEV— lokal para sa pag-unlad at pag-debug
At pati na rin ang 4 na URL para sa bawat isa sa mga environment na ito. Bigyang-pansin natin ang ilang mahahalagang punto.
  1. Ang bawat URL ay isang string constant sa aming enumeration: ang mga ito ay tinukoy sa mga panaklong sa tabi ng bawat enumconstant.
  2. Dapat mayroong isang constructor na tumatagal ng argumento ng parehong uri ng bawat enumpare-pareho.
  3. Ang saklaw ng constructor ay privatealinman sa package private.
  4. Kinakailangang tukuyin ang isang variable - isang field ng klase na mag-iimbak ng mga string constant na aming tinukoy. Dapat kang lumikha ng isang getter method para sa field na ito upang magamit ang mga value ng string constants sa labas.

Pag-ulit sa mga enumerasyon ng string

Sa yugtong ito, maaari na tayong umulit sa lahat ng magagamit enumna mga halaga, pati na rin makakuha ng mga string constant na nauugnay sa kanila. Upang makuha ang lahat ng mga halaga ng anumang enumklase, kailangan mong gamitin ang pamamaraan values():
public class Main {
    public static void main(String[] args) {
        for (Environment env : Environment.values()) {
            System.out.println(env + " : " + env.getUrl());
        }
    }
}
Konklusyon:

PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
Tulad ng makikita mula sa halimbawa, upang i-print ang pangalan ng enumpare-pareho, ipinasa namin ito sa pamamaraan System.out.println, at upang i-print ang url na nauugnay sa pare-parehong ito, ginamit namin ang getter na tinukoy namin.

Pagkuha ng string constant mula sa enum

Upang makuha ang halaga ng anumang string constant, maaari din tayong tumawag ng getter sa anumang enumconstant:
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);

    }
}
Konklusyon:

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

Pagkuha ng enum constant sa pamamagitan ng pangalan

Minsan ito ay kinakailangan upang makakuha enumng isang pare-pareho sa pamamagitan ng kanyang pangalan ng string. Ginagawa ito gamit ang method valueOf(String), na nagbabalik ng constant sa pamamagitan ng pangalan nito:
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());

    }
}
Konklusyon:

Production url is: https://release.application.com/
Development url is: http://localhost:8080
Ngunit kailangan ang pag-iingat dito. Kung ang pamamaraan ay hindi makahanap enumng isang pare-pareho na may tinukoy na pangalan, isang pagbubukod ay itatapon java.lang.IllegalArgumentException.

Pag-convert ng String sa Enum

Minsan ang kabaligtaran na pangangailangan ay lumitaw. Pag-alam sa halaga enum, kunin enumang pare-pareho mismo. Yung. sa aming halimbawa, alam ang isang tiyak na address, kailangan mong makuha ang Environmentkaukulang pare-pareho. Mayroong ilang mga pagpipilian upang gawin ito. At lahat ng mga ito ay nangangailangan ng pagpapabuti sa enumklase mismo. Pagpipilian 1. Enumerasyon sa loob ng klase. Kailangan mong lumikha ng isang paraan na tatanggap ng isang string at ihambing ito sa lahat ng mga halaga enumng klase. Kung may tugma, ibabalik ng pamamaraan ang nais na enumeration. Para sa aming halimbawa, kailangan naming Environmentlumikha ng sumusunod na pamamaraan sa loob ng klase:
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 + "]");
}
Pagkatapos ay makakakuha tayo enummula sa string tulad nito:
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);
    }
}
Konklusyon:

Environment name for url=[http://localhost:8080] is: DEV
Ang diskarte na ito ay may mga downsides. Sa bawat oras, upang makakuha enumng isang pare-pareho, kailangan mong umulit sa lahat ng mga halaga at gumawa ng isang tiyak na bilang ng mga paghahambing. Ang parusa sa pagganap sa kasong ito ay matutukoy sa pamamagitan ng bilang ng mga constant at ang bilang ng mga katulad na operasyon. Ang pangalawang paraan ng paglutas ng problemang ito ay walang problemang ito. Buong Enumcode ng klase:
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 + "]");
    }
}
Pagpipilian 2: Paggamit HashMap Sa kasong ito, lumikha kami ng isang mapa sa loob ng aming enum at i-populate ito nang isang beses sa oras ng pag-compile, at pagkatapos ay kunin ang mga halaga mula dito:
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);
    }
}
Sa mga tuntunin ng paggamit, ang parehong mga pagpipilian ay magkapareho:
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);
    }
}
Konklusyon:

Environment name for url=[http://localhost:8080] is: DEV
Ngunit ang pamamaraang ito ay mayroon ding mga disadvantages. Una, marami pang code. At pangalawa, HashMapang lahat enumng mga halaga ay permanenteng maiimbak sa memorya ng application. Tulad ng nakikita mo, ang lahat ay may mga kalamangan at kahinaan. Ngunit kung isasaalang-alang na enumang mga klase ay karaniwang nag-iimbak ng hindi napakaraming halaga, ang mga kawalan ay halos hindi mapapansin. Mayroong isang caveat: kung ang naturang operasyon (pagkuha ng Java Enum sa pamamagitan ng String value) ay madalas na isinasagawa, mas mahusay na gamitin ang pangalawang opsyon. Maaari kang matuto nang higit pa tungkol sa paksang ito at Enummga klase sa pangkalahatan sa kursong JavaRush. Natututo Enumna ang mga estudyante ng JavaRush sa unang lecture ng ikalimang antas . Pag-convert ng Enum sa String - 2
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION