Bugun biz satr raqamlari bilan, aniqrog'i,
enum
satr konstantalari bilan o'zaro aloqani tashkil qiluvchi sinflar bilan ishlash haqida gaplashamiz.
String sanablaridan foydalanish
Ilovalarni ishlab chiqishda siz vaqti-vaqti bilan belgilangan qator qiymatlari to'plamida ishlashingiz kerak bo'ladi. Bu har qanday narsa bo'lishi mumkin. Masalan, ilova tomonidan qo'llab-quvvatlanadigan rang kodlari ro'yxati yoki ilovamiz o'zaro aloqada bo'lishi mumkin bo'lgan qurilmalar ro'yxati, fasllar va boshqalar. Bularning barchasi umumiy tuzilishga ega bo'lgan oldindan belgilangan qator konstantalari to'plami bo'lib, ular bilan Java kodlari darajasida dasturning o'zaro ta'sirini o'rnatish kerak. Oldindan belgilangan qator (va boshqa) konstantalar bilan o'zaro aloqada bo'lishingiz kerak bo'lganda, eng yaxshi yechim o'z sinfingizni yozishdirenum
. enum
Quyida biz ga aylantirish misollarini ko'rib chiqamiz string
.
String sanablarini yaratish
Keling,enum
ilovani joylashtirish uchun turli muhitlar roʻyxatini hamda har bir muhitning URL manzilini saqlaydigan sinf yarataylik:
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;
}
}
Ushbu sinfda biz 4 ta muhitni aniqladik:
PROD
- ozod qilishTEST
- qo'lda sinov uchunAUTO_TEST
— avtotestlar uchun muhitDEV
— ishlab chiqish va disk raskadrovka uchun mahalliy
- Har bir URL bizning sanabimizdagi satr konstantasidir: ular har bir
enum
konstantaning yonidagi qavslar ichida aniqlanadi. - Har bir konstanta bilan bir xil turdagi argumentni oladigan konstruktor bo'lishi kerak
enum
. - Konstruktor doirasi
private
yokipackage private
. - O'zgaruvchini aniqlash kerak - biz aniqlagan satr konstantalarini saqlaydigan sinf maydoni. Satr konstantalarining qiymatlaridan tashqarida foydalanish uchun ushbu maydon uchun getter usulini yaratishingiz kerak.
Satr sanablarini takrorlash
Ushbu bosqichda biz allaqachon barcha mavjud qiymatlarni takrorlashimizenum
, shuningdek ular bilan bog'langan satr konstantalarini olishimiz mumkin. Har qanday sinfning barcha qiymatlarini olish uchun enum
siz quyidagi usuldan foydalanishingiz kerak values()
:
public class Main {
public static void main(String[] args) {
for (Environment env : Environment.values()) {
System.out.println(env + " : " + env.getUrl());
}
}
}
Xulosa:
PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
Misoldan ko'rinib turibdiki, enum
konstanta nomini chop etish uchun uni usuliga o'tkazdik System.out.println
va bu konstanta bilan bog'langan urlni chop etish uchun biz aniqlagan getterdan foydalandik.
Enum dan satr konstantasini olish
Har qanday satr konstantasining qiymatini olish uchun har qanday konstantada getterni ham chaqirishimiz mumkinenum
:
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);
}
}
Xulosa:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Nomi bo'yicha raqam konstantasini olish
enum
Ba'zan satr nomi bo'yicha doimiyni olish kerak bo'ladi . valueOf(String)
Bu o'z nomi bilan doimiyni qaytaradigan usul yordamida amalga oshiriladi :
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());
}
}
Xulosa:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Ammo bu erda ehtiyot bo'lish kerak. Agar usul ko'rsatilgan nomga ega doimiyni topmasa enum
, istisno chiqariladi java.lang.IllegalArgumentException
.
Stringni Enumga aylantirish
Ba'zida qarama-qarshi ehtiyoj paydo bo'ladi. Qiymatni bilibenum
, enum
doimiyning o'zini oling. Bular. bizning misolimizda ma'lum bir manzilni bilib, siz mos keladigan Environment
doimiyni olishingiz kerak. Buning uchun bir nechta variant mavjud. Va ularning barchasi enum
sinfning o'zida yaxshilanishni talab qiladi. Variant 1. Sinf ichidagi ro'yxatga olish. Siz satrni qabul qiladigan va uni enum
sinfning barcha qiymatlari bilan taqqoslaydigan usulni yaratishingiz kerak. Agar mos keladigan bo'lsa, usul kerakli raqamni qaytaradi. Environment
Bizning misolimiz uchun sinf ichida quyidagi usulni yaratishimiz kerak :
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
Keyin biz satrdan shunday olamiz :
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);
}
}
Xulosa:
Environment name for url=[http://localhost:8080] is: DEV
Ushbu yondashuv o'zining salbiy tomonlariga ega. Har safar enum
doimiy qiymatni olish uchun siz barcha qiymatlarni takrorlashingiz va ma'lum miqdordagi taqqoslashni amalga oshirishingiz kerak bo'ladi. Bu holatda ishlash jazosi doimiylar soni va shunga o'xshash operatsiyalar soni bilan belgilanadi. Ushbu muammoni hal qilishning ikkinchi usuli bu muammoga ega emas. To'liq Enum
sinf kodi:
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 + "]");
}
}
Variant 2: Foydalanish HashMap
Bunday holda, biz raqamimiz ichida xarita yaratamiz va uni kompilyatsiya vaqtida bir marta to'ldiramiz va undan qiymatlarni olamiz:
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);
}
}
Foydalanish nuqtai nazaridan ikkala variant ham bir xil:
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);
}
}
Xulosa:
Environment name for url=[http://localhost:8080] is: DEV
Ammo bu usulning ham kamchiliklari bor. Birinchidan, juda ko'p kod mavjud. Ikkinchidan, HashMap
barcha enum
qiymatlar doimiy ravishda dastur xotirasida saqlanadi. Ko'rib turganingizdek, hamma narsaning ijobiy va salbiy tomonlari bor. Ammo sinflar odatda unchalik ko'p qiymatlarni saqlamasligini hisobga olsak enum
, kamchiliklar deyarli ko'rinmas bo'ladi. Ogohlantirish bor: agar bunday operatsiya (String qiymati bo'yicha Java Enum olish) tez-tez bajarilsa, ikkinchi variantni qo'llash yaxshidir. Enum
JavaRush kursida ushbu mavzu va umuman darslar haqida ko'proq ma'lumot olishingiz mumkin. Talabalar JavaRush-ni beshinchi darajadagi birinchi ma'ruzadaEnum
o'rganadilar .
GO TO FULL VERSION