Обработка Java Enum - PullRequest
       6

Обработка Java Enum

2 голосов
/ 20 апреля 2011

У меня вопрос на Java о лучшем способе работы со следующим предоставленным мне файлом enum.

public enum Foo{

    PLANE(1, "Plane", "plane"),
    CASTLE(2, "Castle", "castle"),
    FEILD(3, "Feild", "field"),
    ROAD(4, "Road", new String[] {"road", "pavement"});
}

Есть примерно 100 записей в вышеуказанных форматах

/**
* Stores a map of the names for fast access. Stores a map of the IDs for fast access.
*/
    private static final Map<Integer,BlockType> ids = new HashMap<Integer,BlockType>();

    private static final Map<String,BlockType> lookup = new HashMap<String,BlockType>();

    private final int id;
    private final String name;
    private final String[] lookupKeys;

    static {
        for(Foo type : EnumSet.allOf(Foo.class)) {
            ids.put(type.id, type);
            for (String key : type.lookupKeys) {
                lookup.put(key, type);
            }
        }
    }


    /**
* Construct the type.
*
* @param id
* @param name
*/
    Foo(int id, String name, String lookupKey) {
        this.id = id;
        this.name = name;
        this.lookupKeys = new String[]{lookupKey};
    }

    /**
* Construct the type.
*
* @param id
* @param name
*/
    Foo(int id, String name, String[] lookupKeys) {
        this.id = id;
        this.name = name;
        this.lookupKeys = lookupKeys;
    }

    /**
* Return type from ID. May return null.
*
* @param id
* @return
*/
    public static Foo fromID(int id) {
        return ids.get(id);
    }

    /**
* Return type from name. May return null.
*
* @param name
* @return
*/
    public static Foo lookup(String name) {
        return lookup.get(name.toLowerCase());
    }

    /**
* Get block numeric ID.
*
* @return
*/
    public int getID() {
        return id;
    }

    /**
* Get user-friendly name.
*
* @return
*/
    public String getName() {
        return name;
    }   

Итак, что я пытаюсь сделать с этим перечислением: пользователь запускает команду, например: / bounce 1

Программа распознает bounce как команду и выглядитдля следующего аргумента.Поскольку 1 следует за командой, теперь он проверяет, является ли 1 допустимым идентификатором # в перечислении.Если это так, он выполняет команду.

Пользователь выдает команду для примера 2 в следующем виде: / bounce plane.На этот раз он проверяет, является ли строка допустимым строковым именем в перечислении, и захватывает ли ID, связанный с ним, для выполнения команды.

Как я могу проверить эти критерии, что либо идентификаторили один из идентификаторов строки существует и всегда возвращает идентификатор # для последующего использования.Буду признателен за любую помощь.

Следует также отметить, что этот enum-файл является собственным независимым файлом классов, вызываемым из основного.

Спасибо всем, кто помог мне встать на правильный путь.Я наградил Wolfcastle правильным ответом, вот что я получил, чтобы работать на меня, но я все еще открыт для любых критических замечаний по поводу логики или недостатков производительности с моим методом.

String s = null;
        try {
            s = in.readLine();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            id = Integer.parseInt(s);
        } catch (NumberFormatException nfe) {

        }
        if (BlockType.lookup(s) != null
                || BlockType.fromID(id) != null) {
            if (BlockType.lookup(s)!= null) {
                blockname = BlockType.lookup(s).getName();
                blockid = BlockType.lookup(s).getID();
            } else {
                blockname = BlockType.fromID(id).getName();
                blockid = BlockType.fromID(id).getID();
            }
        }

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Так что, если я вас правильно понимаю, код, который вы разместили, - это не ваш код, а код, который вы должны использовать, и вам интересно, как вы можете его использовать.

    String param = getParam(); // get the '1' or 'plane' string from your input
    BlockType type = null;
    try {
        // Check for an integer
        int id = Integer.parseInt(param);
        type = BlockType.getFromId(id);
    } catch( NumberFormatException e ) {
        // Okay, not an integer, check the lookup value
        type = BlockType.lookup(param);
    }

    if( type != null ) {
                int blockid = type.getID();
                String blockname = type.getName();
                // continue on
    } else {
    // else the input parameter was invalid and we can't get a BlockType for it
    // return some kind of error
    }
1 голос
/ 20 апреля 2011

В этом случае вы можете просто проверить, является ли возвращаемое значение нулевым.Или что именно вы хотите проверить?

Также обратите внимание, что вам не нужен EnumSet:

static {
    for(Foo type : values()) {
        ids.put(type.id, type);
        for (String key : type.lookupKeys) {
            lookup.put(key, type);
        }
    }
}
...