可能EnumMap被认为是Java bean的合理替代品吗?

时间:2009-08-31 20:02:25

标签: java javabeans value-objects enum-map

好奇是否有人考虑使用EnumMap代替Java bean,特别是“值对象”(没有行为)?对我而言,似乎有一个优点是“属性”的名称可以直接从后备Enum访问,而不需要反射,因此我认为它会更快。

5 个答案:

答案 0 :(得分:1)

bean意味着是可变的,因此是setter方法。 EnumMap的速度与使用带整数的HashMap作为Key的速度相当,但Keys是不可变的。 Beans和EnumMaps有两个不同的用途。如果所有的键在设计时都已知并且保证永不改变,那么使用EnumMap就可以了 更新bean比更改EnumMap的后备枚举要简单得多,在代码中下游创建错误的可能性要小得多。

答案 1 :(得分:1)

可能比使用反射快一点(我没有测量它,也没有在Google中找到任何指标);但是这种方法有很大的缺点:

  1. 你正在失去类型安全。而不是int getAge()String getName(),一切都是Object get(MyEnum.FIELD_NAME)。这将在那里提供一些丑陋的代码和运行时错误。

  2. 我们所爱和享受的所有javabean细节都已消失(例如,属性级别的注释)。

  3. 由于你可以完全没有行为,这种方法的适用性似乎相当有限。

  4. 最重要的是 - 如果你确实需要所谓的:-)性能提升(你需要测量以证明它存在),这在非常具体的情况下可能是一种可行的方法。它是javabeans的可行替代品吗?肯定不是。

答案 2 :(得分:1)

我写了一个Record类,它将键映射到值,并通过委托给完全同步的EnumMap来工作。我们的想法是,Record可以在运行时获取新字段,而Bean则不能。我的结论是,这种灵活性会带来性能影响。这是一个将Record类与完全同步的Bean进行比较的运行。对于1000万次运营:

Record  set(Thing, a)  458 ms
Bean    setThing(a)    278 ms
Record  get(Thing)     398 ms
Bean    getThing       248 ms

因此,在了解数据对象和编写静态建模的类时,可以获得一些东西。如果您希望在运行时将新字段填充到您的数据上,则会花费您的成本。

答案 3 :(得分:0)

我之前没有指定过这个,但我正在使用ResultSet。因此,为了完整起见,我想提供这个答案。

Commons / BeanUtil的"RowSetDynaClass"可能是与混凝土豆相关的过多样板与EnumMap限制之间的幸福介质

答案 4 :(得分:0)

我不明白你如何使用EnumMaps删除'class profileration'。除非你有一个具有20多个属性的泛型枚举,以便为每个'bean'重用,你仍然会发明一个用于每个枚举映射的枚举,例如。

public enum PersonDTOEnum {
     A, S, L;
}

而不是

class Person {

    int a;
    int s;
    String l;

    // getters + setters elided
}

更不用说现在一切都是String。