EnumMap は Java Bean の合理的な代替手段と考えられるでしょうか?
-
20-09-2019 - |
質問
Java Beans、特に「値オブジェクト」(動作なし) の代わりに EnumMap の使用を検討した人がいるかどうか興味がありますか?私にとって、利点の 1 つは、「プロパティ」の名前が、リフレクションを必要とせずに、基になる Enum から直接アクセスできることであるように思えます。そのため、より高速になると思います。
解決
それ 5月 リフレクションを使用するよりも少し速くなります(私は測定しませんでした。Google にも指標が見つかりませんでした)。ただし、このアプローチには大きな欠点があります。
タイプセーフティが失われています。の代わりに
int getAge()
そしてString getName()
すべてがObject get(MyEnum.FIELD_NAME)
. 。これにより、いくつかの醜いコードと実行時エラーが発生します。私たちが気に入って楽しんできた Javabean の優れた機能 (プロパティ レベルのアノテーションなど) はすべてなくなりました。
まったく動作しない可能性があるため、このアプローチの適用可能性はかなり限定されているように見えます。
肝心なのは、パフォーマンスの向上 (その存在を証明するには測定する必要があります) とされるものが本当に必要な場合、これは非常に特殊な状況下では実行可能なアプローチである可能性があるということです。それは Javabeans 全体の実行可能な代替手段でしょうか?間違いなくそうではありません。
他のヒント
Beanは、従ってセッターメソッド、変更可能であることを意味します。 EnumMapは、キーとして整数とHashMapを使用する速度が同等であるが、キーは不変です。豆とEnumMapsは、二つの異なる目的を果たします。すべてのキーは、設計時に知られており、決して変わらないことが保証されている場合は、EnumMapを使用すると、罰金になります。
Beanを更新すると、コード内の下流のエラーを作成するための非常に少ないチャンスでEnumMapのバックアップ列挙型を変更するよりもはるかに簡単です。
私は、キーを値にマップし、完全に同期EnumMapに委譲することで動作しますRecordクラスを書きました。アイデアは、録音ができませんビーンに対し、実行時に新しいフィールドを得ることができるということです。私の結論は、このような柔軟性とパフォーマンスヒットが来るということです。ここで完全に同期ビーンにRecordクラスを比較する実行です。千万操作についてます:
Record set(Thing, a) 458 ms
Bean setThing(a) 278 ms
Record get(Thing) 398 ms
Bean getThing 248 ms
だから、あなたのデータオブジェクトを知り、その静的モデルそれらをクラスを書面で得るためのものがあります。あなたは新しいフィールドが実行時に、あなたのデータへ埋め持つようにしたい場合は、それはあなたの費用がかかります。
私はあなたがEnumMapsで「クラスprofileration」を削除する方法を理解していません。あなたはすべての「豆」のために再利用する20余りの性質を持つ一般的な列挙型を持っていない限り、あなたはまだ例えば、各enumマップに使用する列挙型を発明しています。
public enum PersonDTOEnum {
A, S, L;
}
とは対照的に
class Person {
int a;
int s;
String l;
// getters + setters elided
}
すべてが今の文字列であることは言うまでもありません。
私は以前、これを指定していなかったが、私は、ResultSetで働いています。したがって、私は完全を期すためにこの答えを提供したい。
・コモンズ/ BeanUtilの<のhref = "http://web.archive.org/web/20130305085850/http://commons.apache.org/proper/commons-beanutils/api/org/apache/commons/beanutils のコンクリート豆に関連付けられた過剰な定型の間幸せ媒体、及びEnumMapの制限
かもしれ/RowSetDynaClass.html」REL = 『nofollowをnoreferrer』> 『RowSetDynaClass』