Java枚举和if语句,有更好的方法吗?

发布于 2024-11-07 01:30:51 字数 1051 浏览 0 评论 0原文

我有一个 java Enum 类,在运行时我将从命令行读取一个值,并且我想将该值与我的 Enum 类中的值相对应。 Shipper 是我的枚举类。有没有更好的方法来做到这一点,而不是下面的 ifelse if ?这看起来很难看。

private List<Shipper> shipperName = new ArrayList<Shipper>();
...
public void init(String s){ 
    if(s.equals("a")){
        shipperName.add(Shipper.A);
    }else if(s.equals("b")){
        shipperName.add(Shipper.B);
    }else if(s.equals("c")){
        shipperName.add(Shipper.C);
    }else if(s.equals("d")){
        shipperName.add(Shipper.D);
    }else if(s.equals("e")){
        shipperName.add(Shipper.E);
    }else{
        System.out.println("Error");
    }
}

这是我的 Shipper.class

public enum Shipper
{
    A("a"),
    B("b"),
    C("c"),
    D("e"),
    F("f")
;

    private String directoryName;

    private Shipper(String directoryName)
    {
         this.directoryName = directoryName;
    }

    public String getDirectoryName()
    {
         return directoryName;
    }
}

I have an java Enum class, and at runtime I will read in a value from command line, and I want to correspond this value to a value in my Enum class. Shipper is my Enum Class. Is there a better way do this this, instead of if and else if below? This look ugly.

private List<Shipper> shipperName = new ArrayList<Shipper>();
...
public void init(String s){ 
    if(s.equals("a")){
        shipperName.add(Shipper.A);
    }else if(s.equals("b")){
        shipperName.add(Shipper.B);
    }else if(s.equals("c")){
        shipperName.add(Shipper.C);
    }else if(s.equals("d")){
        shipperName.add(Shipper.D);
    }else if(s.equals("e")){
        shipperName.add(Shipper.E);
    }else{
        System.out.println("Error");
    }
}

Here is my Shipper.class

public enum Shipper
{
    A("a"),
    B("b"),
    C("c"),
    D("e"),
    F("f")
;

    private String directoryName;

    private Shipper(String directoryName)
    {
         this.directoryName = directoryName;
    }

    public String getDirectoryName()
    {
         return directoryName;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

暗藏城府 2024-11-14 01:30:51

是,将字符串添加到枚举的构造函数中(在枚举中指定一个采用字符串的构造函数),并使用文本值 a、b 、c 创建枚举。等等。然后在枚举上实现一个静态工厂方法,它接受一个字符串并返回枚举实例。我将此方法称为 textValueOf。枚举中现有的 valueOf 方法不能用于此目的。像这样的事情:

public enum EnumWithValueOf {

    VALUE_1("A"), VALUE_2("B"), VALUE_3("C");

    private  String textValue;

    EnumWithValueOf(String textValue) {
        this.textValue = textValue;
    }

    public static EnumWithValueOf textValueOf(String textValue){

        for(EnumWithValueOf value : values()) {
            if(value.textValue.equals(textValue)) {
                return value;
            }
        }

        throw new IllegalArgumentException("No EnumWithValueOf
                            for value: " + textValue);  
    }   
}

这是不区分大小写的,并且文本值可以与枚举名称不同 - 如果您的数据库代码深奥或非描述性,但您希望在 Java 代码中使用更好的名称,那么这是完美的。客户端代码然后执行:

EnumWithValueOf enumRepresentation = EnumWithValueOf.textValueOf("a");

Yes add the string into the enum's constructor (specify a constructor in the enum which takes a String) and create the enums with a text value of a, b , c. Etc. Then implement a static factory method on the enum which takes a string and returns the enum instance. I call this method textValueOf. The existing valueOf method in enum cannot be used for this. Something like this:

public enum EnumWithValueOf {

    VALUE_1("A"), VALUE_2("B"), VALUE_3("C");

    private  String textValue;

    EnumWithValueOf(String textValue) {
        this.textValue = textValue;
    }

    public static EnumWithValueOf textValueOf(String textValue){

        for(EnumWithValueOf value : values()) {
            if(value.textValue.equals(textValue)) {
                return value;
            }
        }

        throw new IllegalArgumentException("No EnumWithValueOf
                            for value: " + textValue);  
    }   
}

This is case insensitive and the text value can be different to the enum name - perfect if your database codes are esoteric or non descriptive, but you want better names in the Java code. Client code then do:

EnumWithValueOf enumRepresentation = EnumWithValueOf.textValueOf("a");
旧时浪漫 2024-11-14 01:30:51
shipperName.add(Shipper.valueOf(s.toUpperCase()));

如果名称并不总是与枚举匹配,您可以执行以下操作

public static Shipper getShipper(String directoryName) {
    for(Shipper shipper : Shipper.values()) {
        if(shipper.getDirectoryName().equals(directoryName)) {
            return shipper;
        }
    }
    return null; //Or thrown exception
}
shipperName.add(Shipper.valueOf(s.toUpperCase()));

If the name doesn't always match the enumeration you can do something like this

public static Shipper getShipper(String directoryName) {
    for(Shipper shipper : Shipper.values()) {
        if(shipper.getDirectoryName().equals(directoryName)) {
            return shipper;
        }
    }
    return null; //Or thrown exception
}
鸠书 2024-11-14 01:30:51

您可以从 valueOf() 方法获取 Enum:

public void init(String s) {
    try {
        Shipper shipper = Shipper.valueOf(s.toUpperCase());

        shipperName.add(shipper);
    } catch(IllegalArgumentException e) {
        e.printStackTrace();
    }
}

编辑:

如果它不仅仅是一个简单的 a ->一个案例,那么创建一个带有 key=>value 对的 HashMap 可能是一个想法:

private HashMap<String, Shipper> map;

public void init(String s) {
    if(map == null) {
        map = new HashMap<String, Shipper>();
        map.put("a", Shipper.A);
        ... //b => B code etc
    }

    if(map.containsKey(s)) {
        shipperName.add(map.get(s));
    } else {
        System.out.println("Error");
    }
}

我希望这会有所帮助!

You can get an Enum from the valueOf() method:

public void init(String s) {
    try {
        Shipper shipper = Shipper.valueOf(s.toUpperCase());

        shipperName.add(shipper);
    } catch(IllegalArgumentException e) {
        e.printStackTrace();
    }
}

EDIT:

If it is not just a simple a -> A case, then it might be an idea to create a HashMap with key=>value pairs:

private HashMap<String, Shipper> map;

public void init(String s) {
    if(map == null) {
        map = new HashMap<String, Shipper>();
        map.put("a", Shipper.A);
        ... //b => B code etc
    }

    if(map.containsKey(s)) {
        shipperName.add(map.get(s));
    } else {
        System.out.println("Error");
    }
}

I hope this helps!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文