2

Java Bean、特に「値オブジェクト」(動作なし)の代わりにEnumMapを使用することを検討している人がいるかどうか知りたいですか?私には、「プロパティ」の名前がバッキング列挙型から直接アクセスでき、リフレクションを必要としないという利点があるように思われるため、より高速になると思います。

4

5 に答える 5

1

キーを値にマップし、完全に同期された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

したがって、データオブジェクトを理解し、それらを静的にモデル化するクラスを作成することで得られることがあります。実行時にデータに新しいフィールドを追加する場合は、コストがかかります。

于 2010-02-20T17:52:25.507 に答える
1

Beanは可変であることが意図されているため、setterメソッドです。EnumMapの速度は、キーとして整数を使用するHashMapを使用する場合と同等ですが、キーは不変です。BeansとEnumMapsは、2つの異なる目的を果たします。すべてのキーが設計時に既知であり、変更されないことが保証されている場合は、EnumMapを使用しても問題ありません。
Beanの更新は、EnumMapのバッキング列挙型を変更するよりもはるかに簡単で、コードの下流でエラーが発生する可能性ははるかに低くなります。

于 2009-08-31T20:31:49.617 に答える
1

リフレクションを使用するよりも少し速いかもしれません(私はそれを測定しませんでした、Googleでもメトリックを見つけられませんでした)。ただし、このアプローチには大きな欠点があります。

  1. あなたは型安全性を失っています。の代わりにint getAge()String getName()すべてがですObject get(MyEnum.FIELD_NAME)。それはすぐそこにいくつかの醜いコードと実行時エラーを提供します。

  2. 私たちが愛し、楽しむようになったjavabeanの優れた機能(たとえば、プロパティレベルのアノテーション)はすべてなくなりました。

  3. 動作をまったく持たない可能性があるため、このアプローチの適用性はかなり制限されているようです。

肝心なのは-もしあなたが本当にそれを必要としているのなら:-)パフォーマンスの向上(それが存在することを証明するために測定しなければならないでしょう)これは非常に特定の状況下で実行可能なアプローチかもしれません。これは、JavaBeans全体の実行可能な代替手段ですか?確かにそうではありません。

于 2009-08-31T20:35:50.607 に答える
0

以前はこれを指定していませんでしたが、ResultSetを使用しています。したがって、完全を期すために、この回答を提供したいと思います。

Commons / BeanUtilの「RowSetDynaClass」は、具象豆に関連する過剰な定型文とEnumMapの制限の間の幸せな媒体になる可能性があります

于 2009-09-01T11:24:07.743 に答える
0

EnumMapsを使用して「クラスプロファイル」を削除する方法がわかりません。すべての「bean」に再利用する20個の奇数のプロパティを持つ汎用列挙型がない限り、各列挙型マップに使用する列挙型を発明しています。

public enum PersonDTOEnum {
     A, S, L;
}

とは対照的に

class Person {

    int a;
    int s;
    String l;

    // getters + setters elided
}

言うまでもなく、すべてが文字列になりました。

于 2009-09-01T11:31:21.350 に答える