そこにある宣言にかなり近いと思います(スケッチについては以下を参照)。ただし、Bean 以外のアプローチを使用すると、JavaBeans プロトコルが有効であると想定するほとんどのツールで提供されるサポートが失われる可能性があります。親切にしてください。以下のコードは私の頭の上から外れています...
public class Property<T> {
public final String name;
T value;
private final PropertyChangeSupport support;
public static <T> Property<T> newInstance(String name, T value,
PropertyChangeSupport support) {
return new Property<T>(name, value, support);
}
public static <T> Property<T> newInstance(String name, T value) {
return newInstance(name, value, null);
}
public Property(String name, T value, PropertyChangeSupport support) {
this.name = name;
this.value = value;
this.support = support;
}
public T getValue() { return value; }
public void setValue(T value) {
T old = this.value;
this.value = value;
if(support != null)
support.firePropertyChange(name, old, this.value);
}
public String toString() { return value.toString(); }
}
そして先に進んでそれを使用してください:
public class Customer {
private final PropertyChangeSupport support = new PropertyChangeSupport();
public final Property<String> name = Property.newInstance("name", "", support);
public final Property<Integer> age = Property.newInstance("age", 0, support);
... declare add/remove listenener ...
}
Customer c = new Customer();
c.name.setValue("Hyrum");
c.age.setValue(49);
System.out.println("%s : %s", c.name, c.age);
そのため、プロパティの宣言は 1 行のコードで済み、プロパティ変更のサポートが含まれるようになりました。メソッド setValue() と getValue() を呼び出したので、まだ Rhino などのようにコード化する Bean のように見えますが、簡潔にするために、get() と set() だけを追加できます。残りは読者の演習として残します。
- シリアル化を適切に処理する
- null 値のチェックを処理する
- オートボクシングのオーバーヘッドが気になる場合は、アトミック型の特殊化を追加してください。
- ?? もっと落とし穴があると確信している
また、(通常は匿名クラスとして) サブクラス化し、 setValue() をオーバーライドして、追加のパラメーター チェックを提供できることにも注意してください。
「文字列参照」から本当に逃れることはできないと思います。それがリフレクションのすべてであるからです。
悲しいことに、この時代では、これはまだアセンブリでのプログラミングのようなものです...選択肢があれば、Groovy、C#などはまだより良い選択かもしれません。