LoginSignup
1
3

More than 5 years have passed since last update.

[Javaの小枝] Javaを使っているのにプロトタイプベースのオブジェクトがうらやましい

Posted at

はじめに

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.");
        }

    }

おしまい。
最近、ほんと小技系しか書いてないな…

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3