今日は、文字列列挙の操作、より具体的には、文字列定数との対話を編成するクラスの操作について説明します
enum
。
文字列列挙の使用
アプリケーション開発中は、文字列値の固定セットを定期的に操作する必要があります。それは何でも構いません。たとえば、アプリケーションでサポートされているカラーコードのリスト、またはアプリケーションが対話できるデバイスのリスト、季節などです。これらはすべて、共通の構造を持つ事前定義された文字列定数のセットであり、Java コード レベルでプログラムの相互作用を確立する必要があります。事前定義された文字列 (およびその他) 定数のセットを操作する必要がある場合、最善の解決策は独自の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から文字列定数を取得する
任意の文字列定数の値を取得するには、任意の定数に対して getter を呼び出すこともできます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
定数自体を取得します。それらの。この例では、特定のアドレスがわかっているので、対応する定数を取得する必要があります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
すべての値を反復処理し、一定回数の比較を行う必要があります。この場合のパフォーマンスの低下は、定数の数と同様の操作の数によって決まります。この問題を解決する 2 番目の方法には、この問題はありません。完全な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
この場合、列挙型内にマップを作成し、コンパイル時に一度マップを設定し、そこから値を取得します。
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 の取得) が頻繁に実行される場合は、2 番目のオプションを使用することをお勧めします。このトピックとEnum
クラス全般については、JavaRush コースで詳しく学ぶことができます。学生は、第 5 レベルの最初の講義Enum
ですでにJavaRush を学習しています。
GO TO FULL VERSION