Бүгін біз жол нөмірлерімен, нақтырақ айтсақ,
enum
жол тұрақтыларымен өзара әрекеттесуді ұйымдастыратын сыныптармен жұмыс істеу туралы сөйлесетін боламыз.
Жол нөмірлерін пайдалану
Қолданбаны әзірлеу кезінде жүйелі түрде жол мәндерінің бекітілген жиынымен жұмыс істеу қажет. Бұл кез келген нәрсе болуы мүмкін. Мысалы, қолданба қолдайтын түс codeтарының тізімі немесе қолданбамыз өзара әрекеттесе алатын құрылғылардың тізімі, маусымдар және т.б. Мұның бәрі жалпы құрылымы бар жолдық тұрақтылардың алдын ала анықталған жиыны, олармен Java code деңгейінде бағдарламаның өзара әрекеттесуін орнату қажет. Алдын ала анықталған жол (және басқа) тұрақтылар жиынымен әрекеттесу қажет болғанда, ең жақсы шешім - өзіңіздің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
. - Айнымалыны анықтау қажет - біз анықтаған жол тұрақтыларын сақтайтын класс өрісі. Жол тұрақтыларының мәндерін сырттан пайдалану үшін осы өріс үшін алу әдісін жасау керек.
Жол нөмірлерінің қайталануы
Бұл кезеңде біз барлық қол жетімді мәндерді қайталай аламыз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 мекенжайын басып шығару үшін біз анықтаған қабылдаушыны қолдандық.
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
Кейде тұрақты мәнді жол атауы бойынша алу қажет . 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
сынып codeы:
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
Бірақ бұл әдістің де кемшіліктері бар. Біріншіден, әлдеқайда көп code бар. Екіншіден, HashMap
барлық enum
мәндер қолданба жадында тұрақты сақталады. Көріп отырғаныңыздай, әр нәрсенің жақсы және жаман жақтары бар. Бірақ сыныптар әдетте соншалықты көп емес мәндерді сақтайтынын ескере отырып enum
, кемшіліктер дерлік байқалмайды. Ескерту бар: егер мұндай операция (Жол мәні бойынша Java Enum алу) жиі орындалса, екінші опцияны қолданған дұрыс. Enum
JavaRush курсында осы тақырып және жалпы сабақтар туралы көбірек біле аласыз. Студенттер JavaRush тілін бесінші деңгейдің бірінші лекциясындаEnum
үйренеді .
GO TO FULL VERSION