Hari ini kita akan bercakap tentang bekerja dengan penghitungan rentetan, dan lebih khusus lagi, dengan
enum
kelas yang mengatur interaksi dengan pemalar rentetan.
Menggunakan Penghitungan Rentetan
Semasa pembangunan aplikasi, anda perlu beroperasi secara berkala pada set tetap nilai rentetan. Ia boleh jadi apa sahaja. Contohnya, senarai kod warna yang disokong oleh aplikasi, atau senarai peranti yang boleh digunakan oleh aplikasi kami, musim, dsb. Semua ini adalah set pemalar rentetan yang telah ditetapkan dengan struktur yang sama, yang dengannya perlu untuk mewujudkan interaksi program pada tahap kod Java. Apabila anda perlu berinteraksi dengan set pemalar rentetan (dan lain-lain) yang telah ditetapkan, penyelesaian terbaik ialah menulisenum
kelas anda sendiri. Di bawah ini kita akan melihat contoh penukaran enum
kepada string
.
Mencipta Penghitungan Rentetan
Mari buatenum
kelas yang menyimpan senarai persekitaran yang berbeza untuk menggunakan aplikasi, serta URL bagi setiap persekitaran:
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;
}
}
Dalam kelas ini kami telah menentukan 4 persekitaran:
PROD
- lepaskanTEST
- untuk ujian manualAUTO_TEST
— persekitaran untuk autotestDEV
— tempatan untuk pembangunan dan penyahpepijatan
- Setiap URL ialah pemalar rentetan dalam penghitungan kami: ia ditakrifkan dalam kurungan bersebelahan dengan setiap
enum
pemalar. - Mesti ada pembina yang mengambil hujah dari jenis yang sama seperti setiap
enum
pemalar. - Skop pembina adalah
private
sama adapackage private
. - Ia adalah perlu untuk menentukan pembolehubah - medan kelas yang akan menyimpan pemalar rentetan yang telah kami tentukan. Anda mesti mencipta kaedah pengambil untuk medan ini untuk menggunakan nilai pemalar rentetan secara luaran.
Mengulangi penghitungan rentetan
Pada peringkat ini, kita sudah boleh mengulangi semuaenum
nilai yang tersedia, serta mendapatkan pemalar rentetan yang dikaitkan dengannya. Untuk mendapatkan semua nilai mana-mana enum
kelas, anda perlu menggunakan kaedah values()
:
public class Main {
public static void main(String[] args) {
for (Environment env : Environment.values()) {
System.out.println(env + " : " + env.getUrl());
}
}
}
Kesimpulan:
PROD : https://release.application.com/
TEST : https://test.application.com/
AUTO_TEST : https://autotest.application.com/
DEV : http://localhost:8080
Seperti yang dapat dilihat daripada contoh, untuk mencetak nama enum
pemalar, kami menyerahkannya kepada kaedah System.out.println
, dan untuk mencetak url yang dikaitkan dengan pemalar ini, kami menggunakan pengambil yang kami tentukan.
Mendapat pemalar rentetan daripada enum
Untuk mendapatkan nilai sebarang pemalar rentetan, kita juga boleh memanggil pengambil pada sebarangenum
pemalar:
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);
}
}
Kesimpulan:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Mendapat pemalar enum mengikut nama
Kadang-kadang perlu untuk mendapatkanenum
pemalar dengan nama rentetannya. Ini dilakukan menggunakan kaedah valueOf(String)
, yang mengembalikan pemalar dengan namanya:
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());
}
}
Kesimpulan:
Production url is: https://release.application.com/
Development url is: http://localhost:8080
Tetapi berhati-hati diperlukan di sini. Jika kaedah tidak menemui enum
pemalar dengan nama yang ditentukan, pengecualian akan dilemparkan java.lang.IllegalArgumentException
.
Menukar String kepada Enum
Kadangkala keperluan sebaliknya timbul. Mengetahui nilaienum
, dapatkan enum
pemalar itu sendiri. Itu. dalam contoh kami, mengetahui alamat tertentu, anda perlu mendapatkan Environment
pemalar yang sepadan. Terdapat beberapa pilihan untuk melakukan ini. Dan kesemuanya memerlukan peningkatan dalam enum
kelas itu sendiri. Pilihan 1. Penghitungan di dalam kelas. Anda perlu mencipta kaedah yang akan menerima rentetan dan membandingkannya dengan semua nilai enum
kelas. Sekiranya terdapat padanan, kaedah akan mengembalikan penghitungan yang dikehendaki. Untuk contoh kami, kami perlu Environment
mencipta kaedah berikut di dalam kelas:
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 + "]");
}
Kemudian kita boleh mendapatkan enum
dari rentetan seperti ini:
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);
}
}
Kesimpulan:
Environment name for url=[http://localhost:8080] is: DEV
Pendekatan ini mempunyai kelemahannya. Setiap kali, untuk mendapatkan enum
pemalar, anda perlu mengulangi semua nilai dan membuat beberapa perbandingan. Penalti prestasi dalam kes ini akan ditentukan oleh bilangan pemalar dan bilangan operasi yang serupa. Kaedah kedua untuk menyelesaikan masalah ini tidak mempunyai masalah ini. Enum
Kod kelas penuh :
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 + "]");
}
}
Pilihan 2: Penggunaan HashMap
Dalam kes ini, kami mencipta peta di dalam enum kami dan mengisinya sekali pada masa penyusunan, dan kemudian mengambil nilai daripadanya:
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);
}
}
Dari segi penggunaan, kedua-dua pilihan adalah sama:
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);
}
}
Kesimpulan:
Environment name for url=[http://localhost:8080] is: DEV
Tetapi kaedah ini juga mempunyai kelemahan. Pertama, terdapat lebih banyak kod. Dan kedua, HashMap
semua enum
nilai akan disimpan dalam memori aplikasi secara kekal. Seperti yang anda lihat, semuanya mempunyai kebaikan dan keburukan. Tetapi memandangkan enum
kelas biasanya menyimpan tidak begitu banyak nilai, keburukan akan hampir tidak dapat dilihat. Terdapat kaveat: jika operasi sedemikian (mendapatkan Java Enum oleh nilai String) dilakukan dengan kerap, lebih baik menggunakan pilihan kedua. Anda boleh mengetahui lebih lanjut tentang topik dan Enum
kelas ini secara umum dalam kursus JavaRush. Pelajar Enum
sudah mempelajari JavaRush pada kuliah pertama tahap kelima .
GO TO FULL VERSION