Перечисление Java и оператор if, есть ли лучший способ сделать это? - PullRequest
4 голосов
/ 12 мая 2011

У меня есть класс java Enum, и во время выполнения я буду читать значение из командной строки, и я хочу, чтобы это значение соответствовало значению в моем классе Enum.Shipper мой класс Enum.Есть ли лучший способ сделать это, вместо if и else 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;
    }
}

Ответы [ 3 ]

6 голосов
/ 12 мая 2011

Да, добавить строку в конструктор перечисления (указать конструктор в перечислении, которое принимает строку) и создать перечисления с текстовым значением a, b, c.И т. Д. Затем реализуйте статический метод фабрики для перечисления, который принимает строку и возвращает экземпляр перечисления.Я называю этот метод textValueOf.Существующий метод valueOf в enum не может быть использован для этого.Примерно так:

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");
5 голосов
/ 12 мая 2011
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
}
3 голосов
/ 12 мая 2011

Вы можете получить Enum из метода valueOf ():

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

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

EDIT:

Если это не просто случай a -> A, тогда можно создать 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");
    }
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...