在enum

时间:2015-08-10 13:40:17

标签: java enums

我有一个枚举,其中包含映射到名称和整数的字符串集合。我想基于枚举内的String返回整数。

我也将enum用于其他目的,所以我想保留它(否则我只会使用HashMap)。它甚至可能吗?

这是一个展示我想要实现的目标的例子

public enum Types {

 A("a.micro", 1), B("b.small", 2), C("c.medium", 4);

private String type;
  private int size;

  private Type(String type, int size) {
    this.type = type;
    this.size = size;
  }

  public String getType() {
    return type;
  }

  public int getSize() {
    return size;
  }
}

我想根据类型返回大小:

Type.valueOf("a.micro").getSize();

3 个答案:

答案 0 :(得分:4)

只需在Types类下创建一个全局哈希映射,它存储类型字符串与其对应的枚举实例之间的关系。

private static final Map<String, Types> typeMap = new HashMap<String, Types>();
static {
    for (Types types : values()) {
        typeMap.put(types.type, types);
    }
}

public static Types searchByType(String type) {
    return typeMap.get(type);
}

答案 1 :(得分:2)

您可以使用以下内容:

public static int sizeFor(String name) {
    for(Types type : Types.values()) {
        if(type.getType().equals(name)) {
            return type.getSize();
        }
    }
    // handle invalid name
    return 0;
}

其他选项是在构造函数内部private static Map<String, Integer> sizes = new HashMap<>();Types映射中添加put。然后sizeFor(String)只会进行简单的查找。

private static Map<String, Integer> sizes = new HashMap<>();

Type(String type, int size) {
    this.type = type;
    this.size = size;
    sizes.put(type, size);
}

public static int sizeFor(String name) {
    // Modify if you need to handle missing names differently
    return sizes.containsKey(name) ? sizes.get(name) : 0;
}  

由于type是自定义成员变量,因此没有内置函数。获取Types个实例的唯一内置函数是名称valueOf(即您需要传递"A"等。)

答案 2 :(得分:1)

public enum Type {

    A("a.micro", 1), B("b.small", 2), C("c.medium", 4);

    private static final Map<String, Type> map = createMap();

    private static Map<String, Type> createMap() {
        Map<String, Type> result = new HashMap<>();
        for (Type type : values()) {
            result.put(type.type, type);
        }
        return null;
    }

    private String type;
    private int size;

    private Type(String type, int size) {
        this.type = type;
        this.size = size;
    }

    public String getType() {
        return type;
    }

    public int getSize() {
        return size;
    }

    public static Type getForType(String type) {
        return map.get(type);
    }
}

然后,只需致电:Types.getForType("a.micro").getSize();