JavaRush /בלוג Java /Random-HE /המרת Enum למחרוזת

המרת Enum למחרוזת

פורסם בקבוצה
היום נדבר על עבודה עם ספירות מחרוזות, וליתר דיוק, עם enumמחלקות שמארגנות אינטראקציה עם קבועי מחרוזות. המרת Enum למחרוזת - 1

שימוש בספירות מחרוזות

במהלך פיתוח יישומים, עליך לפעול מעת לעת על קבוצה קבועה של ערכי מחרוזת. זה יכול להיות כל דבר. לדוגמה, רשימה של קודי צבע הנתמכים על ידי האפליקציה, או רשימה של מכשירים שאיתם האפליקציה שלנו יכולה לקיים אינטראקציה, עונות השנה וכו'. כל זה הוא קבוצה מוגדרת מראש של קבועי מחרוזת עם מבנה משותף, שאיתו יש צורך ליצור אינטראקציה עם תוכנית ברמת קוד Java. כאשר אתה צריך אינטראקציה עם קבוצה מוגדרת מראש של מחרוזת (ואחרים), הפתרון הטוב ביותר הוא לכתוב enumמחלקה משלך. להלן נסתכל על דוגמאות להמרה enumל string.

יצירת ספירות מחרוזות

בואו ניצור enumמחלקה המאחסנת רשימה של סביבות שונות לפריסת האפליקציה, כמו גם את כתובת האתר של כל סביבה:
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;
    }
}
במחלקה זו הגדרנו 4 סביבות:
  • PROD- לשחרר
  • TEST- לבדיקה ידנית
  • AUTO_TEST- סביבה לבדיקות אוטומטיות
  • DEV- מקומי לפיתוח וניפוי באגים
וגם 4 כתובות URL לכל אחת מהסביבות הללו. בואו נשים לב לכמה נקודות חשובות.
  1. כל כתובת אתר היא קבוע מחרוזת בספירה שלנו: הם מוגדרים בסוגריים ליד כל enumקבוע.
  2. חייב להיות בנאי שלוקח ארגומנט מאותו סוג של כל enumקבוע.
  3. היקף הבנאי privateהוא package private.
  4. יש צורך להגדיר משתנה - שדה מחלקה שיאחסן את קבועי המחרוזת שהגדרנו. עליך ליצור שיטת getter עבור שדה זה כדי להשתמש בערכים של קבועי מחרוזת באופן חיצוני.

איטרציה על פני ספירות מחרוזות

בשלב זה, אנו כבר יכולים לחזור על כל enumהערכים הזמינים, כמו גם לקבל קבועי מחרוזת המשויכים אליהם. כדי לקבל את כל הערכים של כל enumמחלקה, אתה צריך להשתמש בשיטה values():
public class Main {
    public static void main(String[] args) {
        for (Environment env : Environment.values()) {
            System.out.println(env + " : " + env.getUrl());
        }
    }
}
סיכום:

PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
כפי שניתן לראות מהדוגמה, כדי להדפיס את שם enumהקבוע, העברנו אותו למתודה System.out.println, וכדי להדפיס את כתובת האתר המשויכת לקבוע זה, השתמשנו ב-getter שהגדרנו.

קבלת קבוע מחרוזת מ-enum

כדי לקבל את הערך של קבוע מחרוזת, נוכל לקרוא גם למשבר על כל 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);

    }
}
סיכום:

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

קבלת קבוע enum לפי השם

לפעמים יש צורך לקבל enumקבוע לפי שם המחרוזת שלו. זה נעשה באמצעות השיטה valueOf(String), המחזירה קבוע לפי שמו:
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());

    }
}
סיכום:

Production url is: https://release.application.com/
Development url is: http://localhost:8080
אבל כאן נדרשת זהירות. אם השיטה לא מוצאת enumקבוע עם השם שצוין, ייזרק חריג java.lang.IllegalArgumentException.

המרת מחרוזת ל-Enum

לפעמים מתעורר צורך הפוך. לדעת את הערך enum, לקבל enumאת הקבוע עצמו. הָהֵן. בדוגמה שלנו, לדעת כתובת מסוימת, אתה צריך לקבל את Environmentהקבוע המתאים. ישנן מספר אפשרויות לעשות זאת. וכולם דורשים שיפור בשיעור enumעצמו. אפשרות 1. ספירה בתוך הכיתה. אתה צריך ליצור שיטה שתקבל מחרוזת ולהשוות אותה עם כל הערכים enumשל המחלקה. אם יש התאמה, השיטה תחזיר את הספירה הרצויה. לדוגמא שלנו, עלינו Environmentליצור את השיטה הבאה בתוך המחלקה:
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 + "]");
}
אז נוכל לקבל enumמהמחרוזת כך:
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);
    }
}
סיכום:

Environment name for url=[http://localhost:8080] is: DEV
לגישה הזו יש חסרונות. בכל פעם, כדי לקבל enumקבוע, תצטרך לחזור על כל הערכים ולבצע מספר מסוים של השוואות. עונש הביצוע במקרה זה ייקבע לפי מספר הקבועים ומספר הפעולות הדומות. בשיטה השנייה לפתרון בעיה זו אין בעיה זו. קוד כיתה מלא Enum:
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 + "]");
    }
}
אפשרות 2: שימוש HashMap במקרה זה, אנו יוצרים מפה בתוך ה-enum שלנו ומאוכלסים אותה פעם אחת בזמן ההידור, ואז לוקחים ממנה את הערכים:
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);
    }
}
מבחינת השימוש, שתי האפשרויות זהות:
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);
    }
}
סיכום:

Environment name for url=[http://localhost:8080] is: DEV
אבל לשיטה זו יש גם חסרונות. ראשית, יש הרבה יותר קוד. ושנית, HashMapכל enumהערכים יאוחסנו בזיכרון האפליקציה לצמיתות. כפי שאתה יכול לראות, לכל דבר יש יתרונות וחסרונות. אבל בהתחשב בכך enumשהשיעורים בדרך כלל מאחסנים לא כל כך הרבה ערכים, החסרונות יהיו כמעט בלתי נראים. יש אזהרה: אם פעולה כזו (קבלת Java Enum לפי ערך String) מתבצעת לעתים קרובות, עדיף להשתמש באפשרות השנייה. תוכל ללמוד עוד על נושא זה ועל Enumשיעורים באופן כללי בקורס JavaRush. התלמידים לומדים JavaRush Enumכבר בהרצאה הראשונה של הרמה החמישית . המרת Enum למחרוזת - 2
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION