【问题标题】:How to properly use Enum? [duplicate]如何正确使用枚举? [复制]
【发布时间】:2021-09-01 08:52:08
【问题描述】:

这是我的枚举:

public enum Etichetta {
FT/IR, //problem with '/' character
IB,
COMM;
}

我怎样才能得到那个特殊字符? 请记住,我使用的是通过邮件在正文中发送给我的这个对象,然后我必须保存到 db。

public class PrimaNota {
    private Integer id;
    private String impo;
    private String codC;
    private Etichetta etichetta;
}

在邮寄方式中,他们将 FT/IR 作为 Etichetta 发送给我。我该怎么办?

【问题讨论】:

标签: java enums


【解决方案1】:

这个问题不是由枚举引起的。不能在任何标识符中使用特殊字符“/”,例如枚举、记录、类、函数或变量。

您可以在https://docs.oracle.com/javase/specs/jls/se16/html/jls-3.html 中找到允许的字符。但是,即使某些东西是合法的,这也不一定意味着这是一个好主意,因为存在某些命名约定,例如类名的大写字母。

Identifier:
IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral

IdentifierChars:
JavaLetter {JavaLetterOrDigit}

JavaLetter:
any Unicode character that is a "Java letter"

JavaLetterOrDigit:
any Unicode character that is a "Java letter-or-digit"

“Java 字母”包括大写和小写 ASCII 拉丁文 字母 A-Z (\u0041-\u005a) 和 a-z (\u0061-\u007a),并且,对于 历史原因,ASCII 美元符号($ 或 \u0024)和 下划线(_ 或 \u005f)。美元符号只能用于 机械生成的源代码,或者很少访问预先存在的源代码 遗留系统上的名称。下划线可用于标识符 由两个或多个字符组成,但不能用作 单字符标识符,因为是关键字。

“Java 数字”包括 ASCII 数字 0-9 (\u0030-\u0039)。

但是,您可以做的是创建一个构造函数,该构造函数接受一个字符串参数并将其传递给一个字段,并在创建枚举时调用该构造函数。通过这种方式,您可以将各种字符串与您的枚举常量相关联。

【讨论】:

    【解决方案2】:
     public enum Etichetta {
       FT_IR("FT/IR"),
       IB("IB"),
       COMM("COMM");
    
        private final String value;
    
        Etichetta(String value) {
            this.value = value;
        }
    
        @JsonValue
        public String getValue() {
            return value;
        }
    
        @JsonCreator
        public static Etichetta forValue(String value) {
            return Arrays.stream(Operation.values())
                .filter(op -> op.getValue().equals(value))
                .findFirst()
                .orElseThrow(); // depending on requirements: can be .orElse(null);
        }
    }
    

    或使用 Jackson 2.6.2

       public enum MyEnum {
           @JsonProperty("FT/IR")  FT_IR,
           @JsonProperty("IB")  IB,
           @JsonProperty("COMM")  COMM;
      }
    

    【讨论】:

    • 我没有看到问题中提到 JSON 或 Jackson。
    • 这些函数是公共函数。然后可以重写 setter 和 getter 以使用这些函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 2019-05-22
    • 2013-03-29
    相关资源
    最近更新 更多