Установка значения Enum на основе входящей строки

У меня есть ряд методов setter, которые принимают перечисление. Они основаны на атрибуте входящих объектов. Вместо того, чтобы писать кучу из них, есть способ, связанный с жестким кодом, сказать 10 разных случаев. Будет ли способ создать метод многократного использования?

//Side class declared as
public final enum Side

//How I initialise side
static Side side = Side.SELL;//default

//method to set object
Obj.setSide(sideEnum(zasAlloc.getM_buySellCode()));

//How I am implementing it
    public static Side sideEnum(String buysell)
    {

        if(buysell.equalsIgnoreCase("S"))
        {
            side = Side.SELL; //default 
        }
        else if(buysell.equalsIgnoreCase("B"))
        {
            side = Side.BUY; 
        }

        return side;

    }

Ответ 1

В итоге я использовал простую карту объектов:

private static HashMap<String, Side> sideMap = new HashMap<String, Side>(7);
static{
    sideMap.put("B", Side.BUY);
    sideMap.put("S", Side.SELL);
}

и просто используя

Obj.setSide(sideMap.get(zasAlloc.getM_buySellCode()));

Ответ 2

Вы можете реализовать эту функциональность в Enum.

public enum Side {

    BUY("B"), SELL("S"), ...

    private String letter;
    private Side(String letter) {
        this.letter = letter;
    }

    public static Side fromLetter(String letter) {
        for (side s : values() ){
            if (s.letter.equals(letter)) return s;
        }
        return null;
    }

}

Вы также можете сделать это как вспомогательный статический метод, если вы не можете редактировать Side.

public static Side fromString(String from) {
    for (Side s: Side.values()) {
        if (s.toString().startsWith(from)) {
            return s;
        }
    }

    throw new IllegalArgumentException( from );
}

Вышеупомянутый метод предполагает, что ваши строки соответствуют именам ваших перечислений.

Ответ 3

Enums имеют метод valueOf(), который можно использовать для преобразования из String. Это то, что вы ищете?

Ответ 4

Я думаю, вам нужно что-то вроде:

Obj.setSide(Side.valueOf(zasAlloc.getM_buySellCode()));