Я думаю, что вы довольно близки к тому, что у вас там есть (см. Рисунок ниже). Однако, используя подход не от 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);
Итак, теперь объявление свойства представляет собой одну строку кода, и включена поддержка изменения свойства. Я вызвал методы setValue () и getValue (), чтобы он по-прежнему выглядел как бин для кода, такого как Rhino и тому подобное, но для краткости вы можете добавить просто get () и set (). Остальное оставлено в качестве упражнения для читателя:
- Правильно обращаться с сериализацией
- Обработка проверки нулевого значения
- Может быть, добавить специализацию для атомарных типов, если вам нужны накладные расходы на автобокс.
- ?? Я уверен, что есть и другие ошибки
Также обратите внимание, что вы можете создать подкласс (обычно как анонимный класс) и переопределить setValue (), чтобы обеспечить дополнительную проверку параметров.
Я не думаю, что вы действительно можете уйти от "Строковых ссылок", так как это в значительной степени то, что задумано.
К сожалению, в наше время это все еще похоже на программирование на ассемблере ... Groovy, C # и т. Д. И т. Д. Все еще могут быть лучшим выбором, если у вас есть выбор.