JavaRush /Java Blog /Random-JA /列挙型から文字列への変換

列挙型から文字列への変換

Random-JA グループに公開済み
今日は、文字列列挙の操作、より具体的には、文字列定数との対話を編成するクラスの操作について説明しますenum列挙型から文字列への変換 - 1

文字列列挙の使用

アプリケーション開発中は、文字列値の固定セットを定期的に操作する必要があります。それは何でも構いません。たとえば、アプリケーションでサポートされているカラーコードのリスト、またはアプリケーションが対話できるデバイスのリスト、季節などです。これらはすべて、共通の構造を持つ事前定義された文字列定数のセットであり、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— 開発とデバッグ用にローカル
また、これらの環境ごとに 4 つの URL があります。いくつかの重要な点に注意してみましょう。
  1. 各 URL は列挙内の文字列定数です。これらは各enum定数の横のかっこ内に定義されています。
  2. 各定数と同じ型の引数を取るコンストラクターが必要ですenum
  3. コンストラクターのスコープはprivate次のいずれかですpackage private
  4. 変数、つまり定義した文字列定数を格納するクラス フィールドを定義する必要があります。文字列定数の値を外部で使用するには、このフィールドのゲッター メソッドを作成する必要があります。

文字列列挙の反復処理

この段階で、使用可能なすべての値を反復処理し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

文字列を列挙型に変換する

時には、逆のニーズが生じることもあります。値がわかったらenumenum定数自体を取得します。それらの。この例では、特定のアドレスがわかっているので、対応する定数を取得する必要があります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 を学習しています。 列挙型から文字列への変換 - 2
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION