我讨厌JavaBeans模式,因为它的热情像一千个太阳的火焰一样燃烧。为什么?

  • 详细。现在是2009年。我不必为某个属性编写7 LOC。如果他们有事件监听器,那么请戴上您的帽子。
  • 没有类型安全的引用。没有类型安全的方法来引用属性。 Java的全部要点是它是类型安全的,并且它最流行的模式根本不是类型安全的。

  • 我想要的是这样的:
    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#等,如果您有选择的话,可能仍然是更好的选择。

    10-05 17:42