在java中为枚举添加别名

时间:2017-01-05 20:25:52

标签: java enums getgauge

我有一个用例,我希望使用该枚举的别名访问枚举实例。

我想用别名访问枚举实例的原因是允许访问带有非英文字符的枚举值(我的具体用例是希伯来语)。

问题是这是框架的一部分,我需要能够为任何给定的枚举添加多个别名。需要允许更自然的语言,因为给定的别名将用作规范的一部分(gauge-java)。

有关如何正确使用的任何建议吗?

修改 我正在添加一个例子:

  

转到“בית”

这是一个映射到方法的步骤:

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

2 个答案:

答案 0 :(得分:1)

由于枚举值通过可读性不适合规范,因此您希望用可读单词替换它们。根据{{​​3}},您可以将枚举作为步骤参数传递,但在您的情况下,您可以根据需要传递字符串,然后在步骤方法中使用Factory类从字符串创建枚举:

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;
        }
    }
}

然后你的步骤(当然是Herbew)

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

答案 1 :(得分: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);
    }
}

您还可以省略构造函数并在静态初始化程序中填充别名映射。但我喜欢构造函数如何使它易于阅读和维护哪些别名对应于哪些常量。