Установка значения Enum на основе входящей строки - PullRequest
11 голосов
/ 31 мая 2011

У меня есть несколько методов установки, которые принимают перечисление.Они основаны на атрибуте входящих объектов.Вместо того, чтобы писать кучу таких, есть способ обойти жесткий код, скажем, 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;

    }

Ответы [ 4 ]

25 голосов
/ 31 мая 2011

Вы можете реализовать эту функцию в вашем 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 );
}

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

5 голосов
/ 26 мая 2011

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

2 голосов
/ 05 июля 2011

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

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()));
0 голосов
/ 31 мая 2011

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

Obj.setSide(Side.valueOf(zasAlloc.getM_buySellCode()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...