首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaBeans替代品?

JavaBeans替代品?
EN

Stack Overflow用户
提问于 2009-01-13 23:05:05
回答 11查看 4.2K关注 0票数 11

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

  • 冗长的.现在是2009年。我不应该为一处房产写7份LOC。如果他们有事件侦听器,那就抓住你的帽子。
  • 没有类型安全引用.没有引用属性的类型安全方法。Java的全部意义在于它是类型安全的,而且它最流行的模式根本不是类型- safe。

我想要的是:

代码语言:javascript
复制
class Customer {
    public Property<String> name = new Property();
}

我主要是一个web开发人员,所以它需要JPA和Wicket的支持。

帮我离开javabean火车!

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-01-14 01:43:30

我认为你非常接近你在那里的声明(见下面的草图)。但是,通过使用非bean方法,您可能会失去大多数假设JavaBeans协议生效的工具所提供的支持。请善待我。下面的密码是我头顶上的.

代码语言:javascript
复制
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(); }
}

然后继续使用它:

代码语言:javascript
复制
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#等可能仍然是一个更好的选择。

票数 10
EN

Stack Overflow用户

发布于 2009-01-14 22:20:05

查看我的Bean注释

http://code.google.com/p/javadude/wiki/Annotations

基本上,你所做的事情如下:

代码语言:javascript
复制
@Bean(
  properties={
    @Property(name="name"),
    @Property(name="phone", bound=true),
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
  }
)
public class Person extends PersonGen {}

而不是自己定义所有额外的get/set等方法。

还有其他属性要定义等于/hashCode、观察者、委托、混合器等。

它是一组注释和注释处理器,运行在eclipse或命令行构建中(例如,在ant中)。处理器生成包含所有生成代码的超类(注释处理器不能更改包含注释的类,顺便说一句)。

票数 5
EN

Stack Overflow用户

发布于 2009-01-13 23:12:50

您可能希望查看Groovy --一种具有“真实”属性的动态类型的、基于JVM(并且完全兼容Java)的语言。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/441240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档