1

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

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

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

有关如何正确执行此操作的任何建议?

编辑: 我正在添加一个示例:

转到“בית”

这是将映射到方法的步骤:

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

2 回答 2

2

枚举可以包含静态和实例字段,并且像任何其他类一样具有构造函数:

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

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

于 2017-01-05T21:05:39.847 回答
1

由于枚举值不利于通过可读性进行规范,因此您希望将它们替换为可读的单词。根据文档,您可以将枚举作为 step 参数传递,但在您的情况下,您可以根据需要传递字符串,然后在 step 方法中使用工厂类从字符串创建枚举:

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
}
于 2017-01-05T20:46:33.853 回答