Java枚举到字符串映射保持一致性
我是Java新手,正在为标题编写从枚举到字符串的映射Java枚举到字符串映射保持一致性,java,enums,Java,Enums,我是Java新手,正在为标题编写从枚举到字符串的映射 public class Header { // When adding HeaderType make sure it is consistent with the header name map public enum HeaderType { MARKER, WIDTH, ...... }; private String name; privat
public class Header {
// When adding HeaderType make sure it is consistent with the header name map
public enum HeaderType {
MARKER,
WIDTH,
......
};
private String name;
private String value;
private HeaderType headerType;
// Create an immutable map for header enum to header names
private static final Map<HeaderType, String> headerNameMap;
static {
Map<HeaderType, String> headerNameMapTemp = new HashMap<HeaderType, String>();
headerNameMapTemp.put(HeaderType.MARKER, "MA");
headerNameMapTemp.put(HeaderType.WIDTH, "WI");
headerNameMap = Collections.unmodifiableMap(headerNameMapTemp);
}
public Header(HeaderType headerType, String value) {
this.headerType = headerType;
this.name = Header.getHeaderName(this.headerType);
this.value = value;
}
private static String getHeaderName(HeaderType headerType) {
return headerName.get(headerType);
}
公共类标题{
//添加HeaderType时,请确保它与header name映射一致
公共枚举头类型{
标记,
宽度,
......
};
私有字符串名称;
私有字符串值;
私人头型头型;
//创建头枚举到头名称的不可变映射
私有静态最终地图headernamap;
静止的{
Map headernamaptemp=newhashmap();
HeaderNameApTemp.put(HeaderType.MARKER,“MA”);
HeaderNameAPTemp.put(HeaderType.WIDTH,“WI”);
HeaderNameAP=集合。不可修改映射(HeaderNameApTemp);
}
公共标头(标头类型标头类型,字符串值){
this.headerType=headerType;
this.name=Header.getHeaderName(this.headerType);
这个值=值;
}
私有静态字符串getHeaderName(HeaderType HeaderType){
返回headerName.get(headerType);
}
在上面的代码中,我使用HeaderType enum并使用一个不可变的HashMap从enum转换为header name。正如您所看到的,添加另一个header类型也包括将其添加到映射中。因此,此类型的用户应确保它添加到两个位置,以避免以后出现混乱。它们是否有任何干净的替代方案用于此功能?您可以在
enum
本身中将标题名作为字段,如下所示:
public enum HeaderType {
MARKER("MA"),
WIDTH("WI");
// FOO(), BAR; Won't compile
private final String name;
private HeaderType(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
这样,在不指定相应名称的情况下,就不可能添加新的HeaderType
,您的getHeaderName
方法可以简单地替换为调用getName()
您可以使用enum
的values()
方法枚举所有类型/名称组合:
for (HeaderType headerType : HeaderType.values()) {
System.out.println(headerType.getName());
}
运行示例:您可以在
enum
本身中将标题名称设置为字段,如下所示:
public enum HeaderType {
MARKER("MA"),
WIDTH("WI");
// FOO(), BAR; Won't compile
private final String name;
private HeaderType(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
这样,在不指定相应名称的情况下,就不可能添加新的HeaderType
,您的getHeaderName
方法可以简单地替换为调用getName()
您可以使用enum
的values()
方法枚举所有类型/名称组合:
for (HeaderType headerType : HeaderType.values()) {
System.out.println(headerType.getName());
}
运行示例: