我讨厌JavaBeans模式,因为它的热情像一千个太阳的火焰一样燃烧。为什么?
我想要的是这样的:
class Customer {
public Property<String> name = new Property();
}
我主要是一名Web开发人员,因此需要JPA和Wicket支持。
帮我下Javabean火车吧!
最佳答案
我认为您与那里的声明非常接近(请参阅下面的草图)。但是,通过使用非bean方法,您可能会失去大多数假定JavaBeans协议(protocol)有效的工具所提供的支持。请客气。下面的代码不在我的脑海中...
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(),所以它仍然看起来像Bean,像Rhino之类的东西进行编码,但是为了简洁起见,您可以只添加get()和set()。剩下的作为练习留给读者:
还要注意,您可以子类化(通常作为匿名类)并重写setValue()来提供其他参数检查。
我认为您真的不能摆脱“字符串引用”,因为这几乎就是反射的全部内容。
可悲的是,在当今时代,这仍然有点像在汇编中编程……Groovy,C#等,如果您有选择的话,可能仍然是更好的选择。