Java Bean、特に「値オブジェクト」(動作なし)の代わりにEnumMapを使用することを検討している人がいるかどうか知りたいですか?私には、「プロパティ」の名前がバッキング列挙型から直接アクセスでき、リフレクションを必要としないという利点があるように思われるため、より高速になると思います。
5 に答える
キーを値にマップし、完全に同期されたEnumMapに委任することで機能するRecordクラスを作成しました。アイデアは、レコードは実行時に新しいフィールドを取得できるのに対し、ビーンは取得できないということです。私の結論は、この柔軟性によってパフォーマンスが低下するということです。これは、Recordクラスを完全に同期されたBeanと比較する実行です。1,000万回の操作の場合:
Record set(Thing, a) 458 ms
Bean setThing(a) 278 ms
Record get(Thing) 398 ms
Bean getThing 248 ms
したがって、データオブジェクトを理解し、それらを静的にモデル化するクラスを作成することで得られることがあります。実行時にデータに新しいフィールドを追加する場合は、コストがかかります。
Beanは可変であることが意図されているため、setterメソッドです。EnumMapの速度は、キーとして整数を使用するHashMapを使用する場合と同等ですが、キーは不変です。BeansとEnumMapsは、2つの異なる目的を果たします。すべてのキーが設計時に既知であり、変更されないことが保証されている場合は、EnumMapを使用しても問題ありません。
Beanの更新は、EnumMapのバッキング列挙型を変更するよりもはるかに簡単で、コードの下流でエラーが発生する可能性ははるかに低くなります。
リフレクションを使用するよりも少し速いかもしれません(私はそれを測定しませんでした、Googleでもメトリックを見つけられませんでした)。ただし、このアプローチには大きな欠点があります。
あなたは型安全性を失っています。の代わりに
int getAge()
、String getName()
すべてがですObject get(MyEnum.FIELD_NAME)
。それはすぐそこにいくつかの醜いコードと実行時エラーを提供します。私たちが愛し、楽しむようになったjavabeanの優れた機能(たとえば、プロパティレベルのアノテーション)はすべてなくなりました。
動作をまったく持たない可能性があるため、このアプローチの適用性はかなり制限されているようです。
肝心なのは-もしあなたが本当にそれを必要としているのなら:-)パフォーマンスの向上(それが存在することを証明するために測定しなければならないでしょう)これは非常に特定の状況下で実行可能なアプローチかもしれません。これは、JavaBeans全体の実行可能な代替手段ですか?確かにそうではありません。
以前はこれを指定していませんでしたが、ResultSetを使用しています。したがって、完全を期すために、この回答を提供したいと思います。
Commons / BeanUtilの「RowSetDynaClass」は、具象豆に関連する過剰な定型文とEnumMapの制限の間の幸せな媒体になる可能性があります
EnumMapsを使用して「クラスプロファイル」を削除する方法がわかりません。すべての「bean」に再利用する20個の奇数のプロパティを持つ汎用列挙型がない限り、各列挙型マップに使用する列挙型を発明しています。
public enum PersonDTOEnum {
A, S, L;
}
とは対照的に
class Person {
int a;
int s;
String l;
// getters + setters elided
}
言うまでもなく、すべてが文字列になりました。