היום נדבר על עבודה עם ספירות מחרוזות, וליתר דיוק, עם
enum
מחלקות שמארגנות אינטראקציה עם קבועי מחרוזות.
שימוש בספירות מחרוזות
במהלך פיתוח יישומים, עליך לפעול מעת לעת על קבוצה קבועה של ערכי מחרוזת. זה יכול להיות כל דבר. לדוגמה, רשימה של קודי צבע הנתמכים על ידי האפליקציה, או רשימה של מכשירים שאיתם האפליקציה שלנו יכולה לקיים אינטראקציה, עונות השנה וכו'. כל זה הוא קבוצה מוגדרת מראש של קבועי מחרוזת עם מבנה משותף, שאיתו יש צורך ליצור אינטראקציה עם תוכנית ברמת קוד 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
- מקומי לפיתוח וניפוי באגים
- כל כתובת אתר היא קבוע מחרוזת בספירה שלנו: הם מוגדרים בסוגריים ליד כל
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
, וכדי להדפיס את כתובת האתר המשויכת לקבוע זה, השתמשנו ב-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
כבר בהרצאה הראשונה של הרמה החמישית .
GO TO FULL VERSION