Бүгүн биз сап сандары менен, тагыраагы,
enum
саптык константалар менен өз ара аракеттенүүнү уюштурган класстар менен иштөө жөнүндө сүйлөшөбүз.
String Enumerations колдонуу
Тиркемени иштеп чыгуу учурунда, сиз мезгил-мезгor менен сап баалуулуктарынын белгиленген топтому менен иштешиңиз керек. Бул эч нерсе болушу мүмкүн. Мисалы, тиркеме тарабынан колдоого алынган түс codeдорунун тизмеси же биздин тиркеме өз ара аракеттене ала турган түзмөктөрдүн тизмеси, мезгилдер ж.б. Мунун баары жалпы структурасы бар саптык константалардын алдын ала аныкталган жыйындысы, алар менен Java codeунун деңгээлинде программалык өз ара аракеттенүүнү орнотуу зарыл. Алдын ала аныкталган сап (жана башка) константалар топтому менен иштешүү керек болгондо, эң жакшы чечим - өз классыңызды жазууenum
. enum
Төмөндө биз конversionнын мисалдарын карап чыгабыз 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
— иштеп чыгуу жана мүчүлүштүктөрдү оңдоо үчүн жергorктүү
- Ар бир URL биздин тизмедеги сап константасы: алар ар бир
enum
константтын жанында кашаа ичинде аныкталат. - Ар бир константага окшош типтеги аргументти алган конструктор болушу керек
enum
. - Конструктордун чөйрөсү
private
жеpackage private
. - Биз аныктаган сап константаларын сактай турган өзгөрмө - класс талаасын аныктоо керек. Саптык константалардын маанилерин сырттан колдонуу үчүн бул талаа үчүн алуу ыкмасын түзүшүңүз керек.
Саптардын саны боюнча кайталоо
Бул этапта биз бардык жеткorктүү маанилерди кайталай алабыз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
Бирок бул ыкманын да кемчorктери бар. Биринчиден, дагы көп code бар. Экинчиден, HashMap
бардык enum
баалуулуктар колдонмонун эсинде биротоло сакталат. Көрүнүп тургандай, ар бир нерсенин оң жана терс жактары бар. Бирок enum
класстар, адатта, анчалык көп эмес баалуулуктарды сактай турганын эске алсак, кемчorктер дээрлик көрүнбөй калат. Эскертүү бар: эгерде мындай операция (String мааниси боюнча Java Enum алуу) тез-тез аткарылса, анда экинчи вариантты колдонуу жакшы. Enum
Сиз JavaRush курсунан бул тема жана жалпысынан сабактар тууралуу көбүрөөк биле аласыз. Студенттер JavaRush программасын бешинчи деңгээлдеги биринчи лекциядаEnum
үйрөнүшөт .
GO TO FULL VERSION