gpt4 book ai didi

JavaBeans 替代品?

转载 作者:搜寻专家 更新时间:2023-10-30 21:45:07 30 4
gpt4 key购买 nike

我对 JavaBeans 模式的憎恨就像一千个太阳的火焰一样燃烧。为什么?

  • 冗长。现在是 2009 年。我不应该为一个属性写 7 LOC。如果他们有事件监听器,请捕获你的帽子。
  • 没有类型安全的引用。没有类型安全的方法来引用属性。 Java 的全部要点在于它是类型安全的,而它最流行的模式根本不是类型安全的。

我想要的是这样的:

class Customer {
public Property<String> name = new Property();
}

我主要是一名网络开发人员,所以它需要 JPA 和 Wicket 支持。

帮我下 javabean 火车!

最佳答案

我认为您与那里的声明非常接近(请参见下面的草图)。但是,通过使用非 beans 方法,您可能会失去大多数假定 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(),因此它看起来仍然像一个像 Rhino 之类的代码的 bean,但是为了简洁起见,您可以只添加 get() 和 set()。剩下的留给读者作为练习:

  • 妥善处理连载
  • 处理空值检查
  • 如果您关心自动装箱开销,可以为原子类型添加特化。
  • ??我敢肯定还有更多陷阱

另请注意,您可以子类化(通常作为匿名类)并覆盖 setValue() 以提供额外的参数检查。

我不认为你真的可以摆脱“字符串引用”,因为这几乎就是反射的全部内容。

遗憾的是,在当今时代,这仍然有点像汇编编程...如果您有选择的话,Groovy、C# 等可能仍然是更好的选择。

关于JavaBeans 替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/441240/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com