JavaRush /จาวาบล็อก /Random-TH /การแปลง Enum เป็นสตริง

การแปลง Enum เป็นสตริง

เผยแพร่ในกลุ่ม
วันนี้เราจะพูดถึงการทำงานกับการแจงนับสตริง และโดยเฉพาะอย่างยิ่งกับenumคลาสที่จัดระเบียบการโต้ตอบกับค่าคงที่สตริง การแปลง 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— ท้องถิ่นสำหรับการพัฒนาและการดีบัก
และยังมี URL 4 รายการสำหรับแต่ละสภาพแวดล้อมเหล่านี้ ให้ความสนใจกับประเด็นสำคัญบางประการ
  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 ที่เรากำหนดไว้

รับค่าคงที่สตริงจาก enum

ในการรับค่าของค่าคงที่สตริงใดๆ เราสามารถเรียก 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 ตามชื่อ

บางครั้งจำเป็นต้องได้รับ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 ในกรณีนี้ เราสร้างแผนที่ภายในแจงนับของเราและเติมมันหนึ่งครั้งในเวลาคอมไพล์ จากนั้นนำค่าจากมัน:
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แล้วในการบรรยายครั้งแรกของระดับที่ 5 การแปลง Enum เป็นสตริง - 2
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION