Java 比较枚举中的字符串

Java 比较枚举中的字符串,java,enums,Java,Enums,我想实现将启用或禁用的功能存储到数据库行中。当从网络接收到一些字符串值时,我想将其与ENUM进行比较 枚举: 最好的方法是使用featureMaps.getTerminalConfigurationFeatureBitString.Sale 但我不知道传入的字符串是什么 现在我在映射上得到了getObject的警告类型字符串 有没有其他方法可以在不知道密钥的情况下查询枚举?在这种情况下,我经常会添加一个静态方法getByX,该方法根据枚举的属性进行查找: public enum BitStrin

我想实现将启用或禁用的功能存储到数据库行中。当从网络接收到一些字符串值时,我想将其与ENUM进行比较

枚举:

最好的方法是使用featureMaps.getTerminalConfigurationFeatureBitString.Sale

但我不知道传入的字符串是什么

现在我在映射上得到了getObject的警告类型字符串


有没有其他方法可以在不知道密钥的情况下查询枚举?

在这种情况下,我经常会添加一个静态方法getByX,该方法根据枚举的属性进行查找:

public enum BitString {
    //...

    public static Optional<BitString> getByTransactionType(String transactionType)
    {
        return Arrays.stream(values())
            .filter(x -> x.transactionType.equals(transactionType))
            .findFirst();
    }
}
public static TerminalConfigurationFeatureBitString getByTransactionType(String transactionType) {
    TerminalConfigurationFeatureBitString bitString = TRANSACTION_TYPE_TO_ENUM.get(transactionType);
    if(bitString == null) throw new NoSuchElementException(transactionType);
    return bitString;
}
与类似,您只需在枚举内生成一个静态查找映射,该映射将枚举事务类型映射到实际枚举:

private static final Map<String, TerminalConfigurationFeatureBitString> TRANSACTION_TYPE_TO_ENUM = 
   Arrays.stream(values()).collect(Collectors.toMap(
       TerminalConfigurationFeatureBitString::getTransactionType, 
       Function.identity()
   );
这在某种程度上比前面提到的答案更有效,因为映射是在第一次加载枚举时创建的,所以当它是第一次被引用时。因此迭代只发生一次。此外,映射的查找时间也相当快,因此您可以说,当忽略On的初始计算时间时,以这种方式获取枚举是有效的。您可以使用额外的静态方法扩展枚举,该方法将尝试转换枚举项上的给定字符串:


枚举常量就是:常量。它们应该是大写的。使用TerminalConfigurationnFeatureBitString.valueOftransaction.transactionType,然后使用返回的、已解析的枚举调用featureMaps.get。在此过程中不需要映射case@Lino依赖枚举的名称是不好的做法,就像依赖序数一样。它会导致脆弱的代码。您应该能够重构变量名,而不用担心更改运行时行为。如果你依赖这样的方法,你就不能。我想如果Lombok能自动生成这样的东西可能会更好。也许有一天我会放弃它。@Michael我知道至少是斯威格这么做的,我使用了很多斯威格来生成我的模型如果已经非常巧妙地使用java 8流,为什么不使用Optional来避免静态方法中的空检查?@SharonBenAsher这是非常有见解的,但我只是不喜欢对简单的条件逻辑使用Optional,当然,返回一个Optional与返回null具有相同的效果,如果没有异常,我只会让调用方负责执行异常操作found@SharonBenAsher我引用了Java首席语言架构师Brian Goetz的话。您自己的链接与您不一致可选的目的不是替换代码库中的每一个空引用,而是帮助设计更好的API,在API中,用户只需读取方法的签名,就可以知道是否需要可选值。另外一个问题:如何返回false?不是RuntimeException?你什么意思?有时不能或不应该返回布尔值,有时返回枚举。您可以返回null orElsenull,也可以选择完全删除orElseThrow。如果我有return Optional,您能告诉我如何比较字符串吗?如果未找到消息,是否有打印消息的方法?不支持事务,如果为false,则获取事务未启用?@PeterPenzov您有3种可能的状态,所以我要定义一个枚举。请参阅更新的答案。剩下的由你决定;好的,但当找不到密钥时,如何恢复代码?我不需要IllegalArgumentException。@PeterPenzov,在本例中只返回null;而不是抛出异常。或者选择在这种情况下将返回的默认值。有许多选项取决于您的场景。事实证明,我需要再添加一个案例:如果未找到事务,我希望返回null并打印未找到的消息。如果事务未启用,我希望返回消息:未启用。知道如何实现吗?@PeterPenzov,使用可选类。若返回空的可选值,则表示给定的字符串不是有效的特征。之后,检查地图中的特征。如果地图。得到。。。返回null或false,表示功能已禁用;否则,将启用。
private static final Map<String, TerminalConfigurationFeatureBitString> TRANSACTION_TYPE_TO_ENUM = 
   Arrays.stream(values()).collect(Collectors.toMap(
       TerminalConfigurationFeatureBitString::getTransactionType, 
       Function.identity()
   );
public static TerminalConfigurationFeatureBitString getByTransactionType(String transactionType) {
    TerminalConfigurationFeatureBitString bitString = TRANSACTION_TYPE_TO_ENUM.get(transactionType);
    if(bitString == null) throw new NoSuchElementException(transactionType);
    return bitString;
}
enum TerminalConfigurationFeatureBitString {
    Authorize("authorize", 0), // index 0 in bit string
    Authorize3d("authorize3d", 1), // index 1 in bit String
    Sale("sale", 2), // index 2 in bit String
    Sale3d("sale3d", 3); // index 3 in bit String

    private final String value;
    private final int index;

    TerminalConfigurationFeatureBitString(String value, int index) {
        this.value = value;
        this.index = index;
    }

    public String getValue() {
        return value;
    }

    public int getIndex() {
        return index;
    }

    public static Optional<TerminalConfigurationFeatureBitString> fromValue(String value) {
        for (TerminalConfigurationFeatureBitString item : values()) {
            if (item.value.equals(value)) {
                return Optional.of(item);
            }
        }

        return Optional.empty();
    }
}
public void test() {
    EnumMap<TerminalConfigurationFeatureBitString, Boolean> featureMaps = new EnumMap<>(
        TerminalConfigurationFeatureBitString.class);

    Optional<TerminalConfigurationFeatureBitString> feature = TerminalConfigurationFeatureBitString.fromValue("authorize");
    if (!feature.isPresent()) {
        System.out.println("Feature is not foudn!");
    } else {
        Boolean authorize = featureMaps.get(feature.get());
        if (authorize != null && authorize) {
            System.out.println("Feature is enabled!");
        } else {
            System.out.println("Feature is disabled!");
        }
    }
}