Установка значения 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()));