【问题标题】:How to make key value like enum in java [duplicate]如何在java中制作像枚举一样的键值[重复]
【发布时间】:2017-03-25 15:44:13
【问题描述】:

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

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

因为我将它与 hibernate 一起使用,并且还将其转换为 JSON 用于 alpaca js 表单。

喜欢:

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

我一直在制作enum。如何制作这种类型的enum

【问题讨论】:

  • 它不是重复的,因为我使用的是休眠注释 bean,所以我需要带空格的键和值,您共享的链接使枚举具有字符串值,但它的键不是整数它也是字符串
  • 你确定枚举是解决这个问题的唯一方法吗?
  • 英文单词“inactive”的拼写没有空格。你确定你不能忍受使用正确的拼写吗? :-)
  • 这真的和Hibernate无关。您不能在枚举值中包含空格,这是 Java 语言本身所禁止的。您将不得不为您未描述的用例找到另一种解决方案。
  • 你可以通过正确的拼写来完全避免这个问题inactive

标签: java json hibernate enums alpacajs


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

您可以在一个 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,它将代表您的 Enum 的一个实例,以您想要的方式保存 valuetext

【讨论】:

  • 对不起,我来晚了,没有看到 Chandana Kumara 的回答
  • 很好,但你能帮我弄清楚为什么休眠自动生成的 bean 的名称是字符串而不是文本
  • 我不确定您指的是哪种自动生成,但Status.ACTIVE.name()Status.ACTIVE.toString() 之间存在差异,甚至在此实现中Status.ACTIVE.getText()自动生成的代码调用.name() 方法。在这种情况下,您应该更改它并致电.getText() 或更改您的toString()(更好)
  • 在休眠中,我们使用列表函数自动运行选择查询并使用这些值填充 bean 类列表。
  • 很抱歉,我无法从这里进一步帮助您。如果您尝试使用这个“新”枚举实现并检查您得到的字符串可能是最好的。 .toString() 方法很可能用于将枚举转换为字符串 - 因此您可能想要覆盖该方法。
【解决方案3】:

您不能在标识符中间放置空格。

查看此链接 Is it possible to assign numeric value to an enum in Java? 以将值分配给 java 中的枚举。

【讨论】:

  • 谢谢,但它的价值没有空格
  • 你的枚举值不都是int类型的吗?
  • 值都是int,文本是字符串
猜你喜欢
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 2015-04-10
相关资源
最近更新 更多