JavaRush /مدونة جافا /Random-AR /تحويل التعداد إلى سلسلة

تحويل التعداد إلى سلسلة

نشرت في المجموعة
سنتحدث اليوم عن العمل مع تعدادات السلسلة، وبشكل أكثر تحديدًا، مع enumالفئات التي تنظم التفاعل مع ثوابت السلسلة. تحويل التعداد إلى سلسلة - 1

استخدام تعداد السلسلة

أثناء تطوير التطبيق، تحتاج بشكل دوري إلى العمل على مجموعة ثابتة من قيم السلسلة. يمكن أن يكون أي شيء. على سبيل المثال، قائمة رموز الألوان التي يدعمها التطبيق، أو قائمة الأجهزة التي يمكن أن يتفاعل معها تطبيقنا، والمواسم، وما إلى ذلك. كل هذا عبارة عن مجموعة محددة مسبقًا من ثوابت السلسلة ذات بنية مشتركة، والتي من الضروري من خلالها إنشاء تفاعل البرنامج على مستوى كود Java. عندما تحتاج إلى التفاعل مع مجموعة محددة مسبقًا من ثوابت السلسلة (وغيرها)، فإن الحل الأفضل هو كتابة فصلك الخاص enum. أدناه سننظر في أمثلة التحويل enumإلى string.

إنشاء تعدادات السلسلة

لنقم بإنشاء enumفئة تخزن قائمة بالبيئات المختلفة لنشر التطبيق، بالإضافة إلى عنوان URL لكل بيئة:
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. كل عنوان URL عبارة عن سلسلة ثابتة في تعدادنا: يتم تعريفها بين قوسين بجوار كل 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، ولطباعة عنوان URL المرتبط بهذا الثابت، استخدمنا getter الذي حددناه.

الحصول على ثابت سلسلة من التعداد

للحصول على قيمة أي ثابت سلسلة، يمكننا أيضًا استدعاء getter على أي 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ثابت باسم السلسلة الخاص به. يتم ذلك باستخدام الطريقة 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الثابت نفسه. أولئك. في مثالنا، عند معرفة عنوان معين، تحتاج إلى الحصول على 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 في هذه الحالة، نقوم بإنشاء خريطة داخل التعداد الخاص بنا ونملأها مرة واحدة في وقت الترجمة، ثم نأخذ القيم منها:
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 حسب قيمة السلسلة) بشكل متكرر، فمن الأفضل استخدام الخيار الثاني. يمكنك معرفة المزيد حول هذا الموضوع والفصول Enumالدراسية بشكل عام في دورة JavaRush. يتعلم الطلاب JavaRush Enumبالفعل في المحاضرة الأولى من المستوى الخامس . تحويل التعداد إلى سلسلة - 2
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION