【问题标题】:Getting String value from enum in Java从Java中的枚举获取字符串值
【发布时间】:2013-07-18 11:33:05
【问题描述】:

我有一个这样定义的枚举,我希望能够获取各个状态的字符串。这种方法应该怎么写?

我可以获取状态的 int 值,但也希望可以选择从 int 中获取字符串值。

public enum Status {
    PAUSE(0),
    START(1),
    STOP(2);

    private final int value;

    private Status(int value) {
        this.value = value
    }

    public int getValue() {
        return value;
    }
}

【问题讨论】:

  • 状态 s = Status.PAUSE; System.out.println(s.name());
  • 这个答案将帮助你理解stackoverflow.com/questions/17606866/…
  • 不用定义0,1,2,你可以使用Status.ordinal();
  • @ArnaudDenoyelle:您应该避免使用 ordinal(),请参阅 Joshua Bloch “Effective Java”
  • @GarfieldKlon 我同意。我不(也永远不会)建议依赖ordinal(),因为在枚举中添加一个值会改变每个枚举的序数。我想指出,OP 复制了 ordinal() 的行为。

标签: java enums


【解决方案1】:

如果statusStatus 枚举类型,status.name() 将为您提供其定义的名称。

【讨论】:

  • @JoeMaher toString() 似乎是官方文档的首选方式:“大多数程序员应该优先使用 toString() 方法,因为 toString 方法可能会返回更多用户-友好名称。” (docs.oracle.com/javase/6/docs/api/java/lang/Enum.html#name())
  • @Carsten status.name() 如果你想在代码中使用它(为了准确性和一致性)是合适的,status.toString() 如果你想向用户展示它是合适的(为了可读性)。
【解决方案2】:

你可以使用values()方法:

例如Status.values()[0]会在你的情况下返回PAUSE,如果你打印它,toString()会被调用并且“PAUSE”会被打印出来。

【讨论】:

  • 对,只是添加Status.values()[0] 将是Status 类型而不是String
【解决方案3】:

使用下面给出的默认方法 name()

public enum Category {
        ONE("one"),
        TWO ("two"),
        THREE("three");

        private final String name;

        Category(String s) {
            name = s;
        }

    }

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println(Category.ONE.name());
    }
}

【讨论】:

  • 为什么不覆盖 toString 以返回名称??
  • 返回什么?一或一,有区别(枚举名或其值)
  • 如何打印“一”,“二”,我的意思是枚举的值字符串?
【解决方案4】:

您可以将此方法添加到您的状态枚举中:

 public static String getStringValueFromInt(int i) {
     for (Status status : Status.values()) {
         if (status.getValue() == i) {
             return status.toString();
         }
     }
     // throw an IllegalArgumentException or return null
     throw new IllegalArgumentException("the given number doesn't match any Status.");
 }

public static void main(String[] args) {
    System.out.println(Status.getStringValueFromInt(1)); // OUTPUT: START
}

【讨论】:

    【解决方案5】:

    我相信 enum 在其 API 中有一个 .name(),使用起来非常简单,就像这个例子:

    private int security;
    public String security(){ return Security.values()[security].name(); }
    public void setSecurity(int security){ this.security = security; }
    
        private enum Security {
                low,
                high
        }
    

    有了这个,你可以简单地调用

    yourObject.security() 
    

    它以字符串形式返回高/低,在本例中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 2020-07-11
      • 2021-04-04
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多