【问题标题】:Enum with customized values and Default value具有自定义值和默认值的枚举
【发布时间】:2018-10-12 18:03:44
【问题描述】:

如何使用 value 检索枚举名称。通过传递 JOHN,我需要将值检索为单个

public enum Status {
    JOHN("single"),
    ALEX("married"),
    MARTHA("not known");
}

如果值不匹配,是否可以有默认值?

【问题讨论】:

标签: java string enums


【解决方案1】:

为此,您需要定义一个构造函数和一个String 变量。然后你可以创建一个 getter 方法来返回 String 变量:

public enum Status {
    JOHN("single"),
    ALEX("married"),
    MARTHA("not known");
    private String value;
    private Status(String str) {
       value = str;
    }
    public String getValue() {
        return this.value;
    }
}

然后得到你可以做的价值:

Status.JOHN.getValue()

要从String 获取枚举,您可以使用valueOf() 方法:

Status.valueOf("JOHN").getValue();

但是,如果输入的 String 不对应于枚举,这将引发错误。您可以将其包装在 try-catch 中以为其分配默认值:

try {
   Status.valueOf("JOHN").getValue();
} catch(IllegalArgumentException e) {
   //Assign default
}

但是更好的设计可能是将可能性放入HashMap 并查看输入的String 是否在HashMap 中:

Map<String, Status> status = new HashMap<>();
status.put("JOHN", Y.JOHN);
if(status.containsKey(input)) {
   //Do stuff
} else {
  //Assign default 
}

【讨论】:

  • 你在哪里通过 JOHN 来获取单值?
  • 您能否展示一个示例代码,说明如何在输入值与枚举不匹配的情况下返回默认值
【解决方案2】:

像这样定义你的枚举

enum Status {
    JOHN("single"), ALEX("married"), MARTHA("not known");

    private String value;

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

    public String getValue() {
        return value;
    }

}

现在获取值:

System.out.println(Status.JOHN.getValue());

这里为每个枚举定义一个参数化的构造函数,并将这个值存储在一个成员变量中。

【讨论】:

  • 但是如何传递值。当我们在字符串变量中有值 JOHN 时,Status.JOHN 是不可能的,对吧?
  • @firstpostcommenter 你从来没有说过 JOHN 是一个字符串。使用Status.valueOf("JOHN").getValue()
  • 如果没有匹配项,是否可以发送默认值?
  • 如果没有匹配,您将得到以下异常:Exception in thread "main" java.lang.IllegalArgumentException: No enum constant。您可以使用try-catch 处理此异常并从那里返回“DEFAULT”。
  • This 会给你一个很好的洞察力。
【解决方案3】:

Java 枚举是一个对象,在大多数情况下与其他对象一样。你可以给它字段、方法和构造函数。

在这种情况下,您可以提供一个 marriage 字段并将其设置在构造函数中,就像对任何其他对象一样。

查看有关 Java 枚举的官方页面以查看官方示例,特别是针对您的案例的行星示例。 The Java Tutorials: Enum Types


另请注意,您可能不希望将此特定数据表示为枚举。通过这样做,您将仅限于这 3 个特定的人。 只有当你知道在这段代码的整个生命周期内你肯定只有这个特定的人员列表时才合适。否则你应该只使用一个普通的对象。

一个更好的主意可能是有一个婚姻枚举并给你的人一个这种类型的字段。

public enum MarriageStatus
{
    Married,
    NotMarried,
    Unknown;
}

public class Person
{
    String name = "Unknown";
    MarriageStatus marriageStatus = MarriageStatus.Unknown;
}

【讨论】:

    猜你喜欢
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2011-10-27
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多