如何在Java中创建类似于枚举的键值对?

14

我需要创建一个包含一些带有空格的字符串及其对应的int值的Enum,例如:

public enum status{
Active(1),
Inactive(2);
}

因为我将与 Hibernate 一起使用它,并且还将将其转换为 JSON 以供 Alpaca JS 表单使用。

例如:

[{"text": "Inactive", "value":"2"},{"text": "Active", "value":"1"}]

我制作enum时卡住了。如何制作这种类型的enum


这不是重复的,因为我正在使用带有Hibernate注解的Bean,在其中使用了它,所以我需要带有空格的键和值。你分享的链接创建了一个值为字符串的枚举,但它的键不是整数,而是字符串。 - Saqib Ahmed
你确定枚举是解决这个问题的唯一方法吗? - Murat Karagöz
英文单词“inactive”拼写时不带空格。您确定不能使用正确的拼写吗? :-) - Ole V.V.
谢谢,但这是客户的要求,将来我们可能会面临类似的需求,需要使用不同的值。 - Saqib Ahmed
1
这与Hibernate实际上没有任何关系。在枚举值中不能有空格,这是Java语言本身禁止的。你必须找到另一个解决方案来处理你没有描述的用例。 - Tunaki
2
你可以通过正确拼写“inactive”来完全避免这个问题。 - Ryan Ward Valverde
3个回答

39

您不能在字符串之间放置空格。您可以使用下划线来代替,如下所示:

In_Active
您可以使用这种方式:

enum Status {

    ACTIVE("Active", 1), IN_ACTIVE("In Active", 2);

    private final String key;
    private final Integer value;

    Status(String key, Integer value) {
        this.key = key;
        this.value = value;
    }

    public String getKey() {
        return key;
    }
    public Integer getValue() {
        return value;
    }
}

是的,我知道我不能,但我需要它。 - Saqib Ahmed
请检查修改后的答案。 - Chandana Kumara
谢谢@Chandana Kumara,我需要更多的帮助。我已经实现了它,但是Hibernate正在获取它的名称并显示它。 - Saqib Ahmed
你尝试使用@Enumerated注释了吗? - Chandana Kumara
请参考以下链接:https://docs.jboss.org/hibernate/orm/5.0/mappingGuide/en-US/html_single/#basic-enums 或 https://virgo47.wordpress.com/2014/08/02/converting-java-enums-to-values-and-back/。 - Chandana Kumara
这是一个关于XML版本的链接:https://talk.openmrs.org/t/best-practice-to-store-enum-via-hibernate/1721 - Chandana Kumara

11

您可以在一个enum中持有多个值,甚至可以使用getter来处理它们。以下是我曾经使用的一个示例(我尝试将其适应于您的问题):

您可以在一个enum中持有多个值,甚至可以使用getter来处理它们。以下是我曾经使用的一个示例(我尝试将其适应于您的问题):

public enum Status{

    ACTIVE(1, "Active"),
    INACTIVE(2, "In Active");

    private final Integer value;
    private final String text;

    /**
     * A mapping between the integer code and its corresponding text to facilitate lookup by code.
     */
    private static Map<Integer, Status> valueToTextMapping;

    private Status(Integer value, String text){
        this.value = value;
        this.text = text;
    }

    public static Status getStatus(Integer i){
        if(valueToTextMapping == null){
            initMapping();
        }
        return valueToTextMapping.get(i);
    }

    private static void initMapping(){
        valueToTextMapping = new HashMap<>();
        for(Status s : values()){
            valueToTextMapping.put(s.value, s);
        }
    }

    public Integer getValue(){
        return value;
    }

    public String getText(){
        return text;
    }

    @Override
    public String toString(){
        final StringBuilder sb = new StringBuilder();
        sb.append("Status");
        sb.append("{value=").append(value);
        sb.append(", text='").append(text).append('\'')
        sb.append('}');
        return sb.toString();
    }
}

在您的代码中,您可以简单地使用 Status.ACTIVE,它将表示一个您想要的包含valuetext的枚举实例。


抱歉,我有点晚了,没有看到Chandana Kumara的答案。 - GameDroids
很好,但你能帮我解释一下为什么Hibernate自动生成的bean的名称是字符串而不是文本吗? - Saqib Ahmed
我不确定您所指的自动生成类型是什么,但是Status.ACTIVE.name()Status.ACTIVE.toString()之间存在差异,并且在此实现中甚至包括Status.ACTIVE.getText()。可能自动生成的代码调用了.name()方法。在这种情况下,您应该更改并调用.getText()或更改您的toString()(更好)。 - GameDroids
在Hibernate中,我们使用list函数自动运行select查询,并将填充这些值的bean类列表。 - Saqib Ahmed
抱歉,我无法在此处为您提供更多帮助。使用这个“新”的枚举实现并检查您获得的字符串可能是最好的选择。很可能会使用.toString()方法将枚举转换为字符串 - 因此,您可能需要重写该方法。 - GameDroids

1

谢谢,但它的值没有空格。 - Saqib Ahmed
你的枚举值都是 int 类型吗? - Someone
值都是整数,文本是字符串。 - Saqib Ahmed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接