好奇是否有人考虑使用EnumMap代替Java bean,特别是“值对象”(没有行为)?对我而言,似乎有一个优点是“属性”的名称可以直接从后备Enum访问,而不需要反射,因此我认为它会更快。
答案 0 :(得分:1)
bean意味着是可变的,因此是setter方法。 EnumMap的速度与使用带整数的HashMap作为Key的速度相当,但Keys是不可变的。 Beans和EnumMaps有两个不同的用途。如果所有的键在设计时都已知并且保证永不改变,那么使用EnumMap就可以了 更新bean比更改EnumMap的后备枚举要简单得多,在代码中下游创建错误的可能性要小得多。
答案 1 :(得分:1)
可能比使用反射快一点(我没有测量它,也没有在Google中找到任何指标);但是这种方法有很大的缺点:
你正在失去类型安全。而不是int getAge()
和String getName()
,一切都是Object get(MyEnum.FIELD_NAME)
。这将在那里提供一些丑陋的代码和运行时错误。
我们所爱和享受的所有javabean细节都已消失(例如,属性级别的注释)。
由于你可以完全没有行为,这种方法的适用性似乎相当有限。
最重要的是 - 如果你确实需要所谓的:-)性能提升(你需要测量以证明它存在),这在非常具体的情况下可能是一种可行的方法。它是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。