はじめに
Javaを使用している最中にプロトタイプベースのオブジェクトがうらやましくなったりすることがないだろうか。Propertiesのようなオブジェクトに文字列以外のものを入れたかったり、簡易言語の処理系を書いていたり、といったケースを想定している。Map<Object, Object> を生のまま使用しても良いのだが型安全でないのが少し気になる場合には以下のようなコードを使うと良いかもしれない。
Utils.java
public static class VarName<T> {
@SuppressWarnings("unchecked") public T cast(Object obj) {return (T) obj;}
}
public static class PrototypicalObj {
private final PrototypicalObj parent;
private final Map<Object, Object> content = new HashMap<>();
public PrototypicalObj() {parent = null;}
public PrototypicalObj(PrototypicalObj parent_) {parent = parent_;}
public <T> T get(VarName<T> var) {
if (content.containsKey(var)) return var.cast(content.get(var));
if (parent != null) return parent.get(var);
return null;
}
public <T> PrototypicalObj put(VarName<T> var, T value) {content.put(var, value); return this;}
}
使い方
使い方は簡単。
Utils.java
public static final VarName<String> FORENAME = new VarName<>();
public static final VarName<String> SURNAME = new VarName<>();
public static final VarName<Integer> AGE = new VarName<>();
public static void main(String[] args) {
PrototypicalObj p = new PrototypicalObj().put(FORENAME, "Tom").put(SURNAME, "Cruise").put(AGE, 55);
PrototypicalObj c = new PrototypicalObj(p).put(FORENAME, "Connor").put(AGE, 21);
{
String forename = p.get(FORENAME); // 型安全
String surname = p.get(SURNAME);
int age = p.get(AGE);
System.out.println(forename + " " + surname + " is " + age + " years old.");
}
{
String forename = c.get(FORENAME);
String surname = c.get(SURNAME);
int age = c.get(AGE);
System.out.println(forename + " " + surname + " is " + age + " years old.");
}
}
おしまい。
最近、ほんと小技系しか書いてないな…