วันนี้เราจะพูดถึงการทำงานกับการแจงนับสตริง และโดยเฉพาะอย่างยิ่งกับ
enum
คลาสที่จัดระเบียบการโต้ตอบกับค่าคงที่สตริง
การใช้การแจงนับสตริง
ในระหว่างการพัฒนาแอปพลิเคชัน คุณจะต้องดำเนินการกับชุดค่าสตริงคงที่เป็นระยะ มันอาจจะเป็นอะไรก็ได้ ตัวอย่างเช่น รายการรหัสสีที่แอปพลิเคชันรองรับ หรือรายการอุปกรณ์ที่แอปพลิเคชันของเราโต้ตอบได้ ฤดูกาล ฯลฯ ทั้งหมดนี้เป็นชุดค่าคงที่สตริงที่กำหนดไว้ล่วงหน้าซึ่งมีโครงสร้างทั่วไปซึ่งจำเป็นต้องสร้างการโต้ตอบของโปรแกรมในระดับโค้ด 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 เป็นค่าคงที่สตริงในการแจงนับของเรา โดยกำหนดไว้ในวงเล็บถัดจากค่าคงที่แต่ละ
enum
รายการ - จะต้องมีตัวสร้างที่รับอาร์กิวเมนต์ประเภทเดียวกันกับ
enum
ค่าคงที่ แต่ละตัว - ขอบเขตของตัวสร้างคือ
private
อย่างใดอย่างpackage private
หนึ่ง - จำเป็นต้องกำหนดตัวแปร - ฟิลด์คลาสที่จะเก็บค่าคงที่สตริงที่เรากำหนดไว้ คุณต้องสร้างเมธอด 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
GO TO FULL VERSION