【问题标题】:Nested enum with definition as String定义为字符串的嵌套枚举
【发布时间】:2017-09-05 11:30:35
【问题描述】:

我遇到了嵌套枚举的问题。所以,我有一个嵌套枚举,如您所见,它具有默认值。之前只有 CD 和 CM 之类的枚举。现在我为每一个都设置了类似定义的东西,你可以看到“Cool Ds”等。目前我面临一个问题,我无法读取枚举字符串,它位于 () 和我不知道如何修复它了。有人有想法吗?

 package com.test.beans;

  import java.io.Serializable;
  import com.fasterxml.jackson.annotation.JsonIgnoreProperties;


@JsonIgnoreProperties(ignoreUnknown = true)
public class RecordBean implements Serializable {
public enum Types {
    CDs("Cool Ds"), CMs("Cool Ms");

   private final  String s;
   private Types(String s) {
        this.s=s;
    }

    public String getTypes(){
       return s;
    }
    public static Types fromNumeric(int index) {
        switch (index) {
            default:
                return null;
            case 0:
                return Types.CDs;
            case 1:
                return Types.CMs;

        }
    }

}


private Types type;

private float value;

public RecordBean() {
    // default constructor for default instantiate
}

public RecordBean(Types type, float value) {
    this.type = type;
    this.value = value;
}

public Types getType() {
    return type;
}

public void setType(Types type) {
    this.type = type;
}

public float getValue() {
    return value;
}

public void setValue(float value) {
    this.value = value;
}


}

更新

我得到的错误:

    17/04/10 12:44:53 ERROR App$: Can not construct instance of com.test.beans.RecordBean$Types from String value 'Cool Ds': value not one of declared Enum instance names:  CDs, CMs ]

如您所见,他没有将我的字符串“Cool Ds”与括号中的枚举字符串进行比较,而是与纯枚举或 CDsCMs

我的用例是这样的。我正在处理 spark 流,其中数据传入我的 RecordBean 类,并且与我的 enum 类型进行比较。因为数据库中的类型从 CMs 更改为 Cool Ms 我需要通过向 Enum 添加定义来更改我的应用程序中的相同类型。之后我无法完成应用程序处理枚举的部分,如 CMs 并读取其定义或 Cool Ms

【问题讨论】:

  • 不幸的是,我知道你到底在问什么......
  • 我更新它并设置 ERROR 也许现在很清楚了? :)
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建 minimal reproducible example。您的更新有所帮助,但仍然只是我们可能需要的一半。
  • 更新二号,很好吗?

标签: java enums


【解决方案1】:

请确保,您可以阅读:CDs.getTypes() 和 CMs.getTypes()

【讨论】:

  • 不,我收到incompatible types: java.lang.String cannot be converted to com.test.beans.RecordBean.Types
【解决方案2】:

猜测:也许框架正在对您的枚举常量调用 toString(),因此您可能需要添加:

public enum Types {
 ...
 @Overrride 
 public String toString() { return s; }

换句话说:确保您现有的枚举常量确实在使用“新”更改的字符串名称。

但除此之外:考虑退后一步,改变你的整体设计。您的问题并不少见 - 从编程的角度来看,枚举很好(例如:使用枚举常量会导致代码更简洁);但是:它们适合持久性。使用枚举进行版本控制是地狱。

【讨论】:

  • 是的,我知道你所说的版本控制,但现在我只需要原型,然后我将重新设计整个应用程序。另外,我尝试了您的猜测,但 ERROR 仍然在这里
  • 我猜你想添加一堆跟踪语句 - 比如在你的枚举的每个方法中......只是为了看看什么叫做;如果有什么你可以轻松做到的。我正在考虑添加额外的枚举常量;可能使用与 CD 和 CM 最初使用的 相同 字符串。
  • 嗯,这是我最初的想法,我只想返回例如:“Cool Ds”,但在枚举中,否则我需要更改很多我现在不需要的东西。如果您想到任何简单的步骤来解决这个问题,我会尝试使用 JSONValue 注释:)
  • 放心;如果我有更好的想法;我早就告诉你了;-(
猜你喜欢
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 2012-01-25
  • 1970-01-01
  • 2021-12-23
相关资源
最近更新 更多