Type Safe Enumeration なクラスの作り方
Java の言語使用では列挙型がサポートされていません。(1.4 まで)
そこで、列挙型を表すクラスの作り方を紹介します。かなり便利です。
Type Safe Enumeration を使う一番のメリットはメソッドを継承したり利用できる所です。
詳しくは Effective Java で紹介されています。
※ Java5.0 より Enum を使用可能になりました。
ソース記述例
import java.io.*;
import java.util.*;
public abstract class FileTypeEnum implements Serializable {
private String value;
private String name;
private static Map all;
private static final long serialVersionUID = 0L;
public static final FileTypeEnum TEXT = new FileTypeEnum("text", "テキスト") {
public String getSuffix() {
return ".txt";
}
};
public static final FileTypeEnum HTML = new FileTypeEnum("html", "HTML") {
public String getSuffix() {
return ".html";
}
};
public static final FileTypeEnum PDF = new FileTypeEnum("pdf", "PDF") {
public String getSuffix() {
return ".pdf";
}
};
private static final FileTypeEnum[] ALL = new FileTypeEnum[]{TEXT, HTML,
PDF};
static {
all = new HashMap();
for (int i = 0; i < ALL.length; i++) {
all.put(ALL[i].getValue(), ALL[i]);
}
}
public static FileTypeEnum valueOf(String value) {
FileTypeEnum ret = (FileTypeEnum)all.get(value);
if (ret == null) {
throw new IllegalArgumentException("For input argument [" + value
+ "]");
}
return ret;
}
public static FileTypeEnum[] getAllType() {
return ALL;
}
public abstract String getSuffix();
public String getValue() {
return value;
}
public String getName() {
return name;
}
public String toString() {
return new StringBuffer().append("[").append(value).append(":")
.append(name).append(":").toString();
}
Object readResolve() throws ObjectStreamException {
return all.get(value);
}
private FileTypeEnum(String value, String name) {
this.value = value;
this.name = name;
}
}
|