2017-01-05 3 views
1

私はその列挙型の別名で列挙型インスタンスにアクセスしたいユースケースがあります。Javaの列挙型にエイリアスを追加

別名でenumインスタンスにアクセスしたいのは、英語以外の文字でenumの値にアクセスできるようにするためです(私の特定の使用例はヘブライ語です)。

これはフレームワークの一部であり、指定された列挙型に複数のエイリアスを追加できる必要があります。指定されたエイリアスが仕様の一部として使用されるように、より自然な言語を許可する必要があります(gauge-java)。

これを正しく行う方法についてのご意見はありますか?

EDIT: 私は例を追加している:

Goがする "בית"

をこのメソッドにマッピングされるステップである:

@Step("Go to <page>") 
public void goToPage(Page page) {...} 
+2

要件は(私にとっては少なくとも)明確ではありません。ここで達成したいと思っている疑似コードをいくつか教えてください。 – Mureinik

+0

次のようなことができます: 'enum E {A、B;静的最終E C = A、D = B; } '。あるいは、文字列エイリアスとマップルックアップを使用することもできます。 – shmosel

+0

@Mureinik Wellゲージは、自然言語で記述された実行仕様を作成できるようにするためのものです。 このように私は「ページ内」の家庭では「ものをやる」ことを許可したいと思います。これは、署名が以下のメソッドにマップされます: @Step( "の作業中") public void doStuffInPage(ページページ) しかし、私の場合は、ページがヘブライ語である必要があります。そのために私はenumのエイリアスが必要です。 –

答えて

1

enum値は読みやすさで指定するのには適していないので、読み込み可能な値に置き換える必要がありますrds。 (

public class MyEnumUtil { 

    private MyEnumUtil() {} 

    public static MyEnum fromHerbew(String stringValue) { 
     switch (stringValue) { 
      case "צָפוֹן,": return MyEnum.NORTH; 
      case "מזרח,": return MyEnum.EAST; 
      case " מַעֲרָב,": return MyEnum.WEST; 
      case "  דָרוֹם": return MyEnum.SOUTH; 
      default: return null; 
     } 
    } 
} 

は、その後、あなたのステップは次のようになります。documentationによると、あなたはステップパラメータとして列挙型を渡すことができますが、あなたが望むようあなたのケースであなたは、文字列を渡すことができ、その後、ステップ方式でちょうどファクトリクラス使用して文字列から列挙型を作成しますもちろんHerbew中)

@Step("Navigate towards <directionString>") 
public void navigate(String directionString) { 
    MyEnum direction = MyEnumUtil.fromHerbew(directionString); 
    // use enum 
} 
+0

しかし、フレームワーク側から、私はユーザーにその必要性を保存したいと思います。私は、この定型コードを書く必要なくこの能力を可能にするソリューションを作りたいと思っています。 –

+0

私は全体の画像が表示されませんが、この場合、エイリアスをプロパティファイルに移動し、Herbewバリアントを実際の列挙値でマップすることができます。 –

+0

しかし、それは私がフレームワークから期待するエレガントな解決策ではありません。私は、その機能を得るために、フレームワークのユーザー(開発者)ができるだけ少ないコード(プロパティファイルなどのファイルがさらに悪い)で記述する必要があるソリューションを希望します。 –

0

列挙型は、静的およびインスタンスフィールドが含まれており、他のクラスのようなコンストラクタを持つことができます。

enum Foo { 
    A("alias1", "alias2"), 
    B("alias3"); 

    private static final Map<String, Foo> gAliases = new HashMap<>(); 

    private Foo(String... aliases) { 
     for(final String alias : aliases) { 
      gAliases.put(alias, this); 
     } 
    } 

    public static Foo forAlias(String alias) { 
     return gAliases.get(alias); 
    } 
} 

また、省略することができスタティックイニシャライザでエイリアスマップを生成します。しかし、どのコンストラクターがどのエイリアスがどの定数に対応するのかを読みやすく、維持するのが簡単なのが好きです。

+0

はい、私はそれを認識していますが、Enumに適合するソリューションが必要です。静的メソッドは、一度に複数のEnumに適合する解決策ではありません。 –

+0

@BoazBerman複数の列挙型へのエイリアスのマッピングは、列挙型が提供する厳密な型指定の目的を無効にするようです。 –

+0

Enumはインターフェイスを実装することもできます。そのため、同じインターフェイスを実装する複数のインターフェイスを用意し、エイリアスマップをいくつかのユーティリティクラスに配置できます。 –