2


タイトルで申し訳ありませんが、これ以上わかりやすいタイトルが思いつきませんでした。

私が開発しているスタンドアロン アプリケーション (大学の課題です) で、この問題に直面して
います。POJO にすぎないエンティティ (またはモデル オブジェクトやビジネス オブジェクトなど) があります。

当然、それらを使用するクラスは多数あります (今後も使用される予定です) が、これらのクラスの一部は値を変更することを許可されるべきではありません (たとえば、セッターを使用して)。オブジェクトを異なるアクセス許可を持つ異なるクラスに渡す必要があると言えます。一部のクラスには読み取り専用、オブジェクトの状態を変更できる他のクラスには読み書き可能です。

例として、オブジェクトに関する情報のみを表示する GUI ウィンドウがあります。このクラスが、オブジェクトの状態を変更する方法を完全に認識しないようにしたいと考えています。

関連する問題 (読み取り専用インターフェース、読み取り専用実装、防御コピーなど) に関する多くのトピックを読みましたが、自分のケースに適したものは見つかりませんでした。

オブジェクトのセッター メソッドへのアクセスを特定のクラスにのみ許可したいとしますが、これを実現する方法が見つかりません。

私は当初、インターフェイスは問題ないと考えていました (たとえばReadOnlyObject、getter とWriteOnlyObjectsetter を使用し、Objectそれらの両方を実装する) が、問題は、. それに加えて、getter または setter のみを使用してインターフェイスを記述することが適切な方法であるとは確信していません。WriteOnlyObjectReadOnlyObject

助けてください!@_@

4

3 に答える 3

1

特定のpojoについて、「Customer」と呼びます。2つのインターフェイスを作成する必要があります。getterメソッドのみを持つICustomerROという名前のインターフェイスを作成します。ICustomerROを拡張し、setterメソッドを追加するICustomerという名前のインターフェイスを作成します。最後に、完全に機能するgetterメソッドとsetterメソッドを使用し、ICustomerを実装するpojoを作成します。

もちろん、任意の命名規則を使用できます。

コードでは、pojoへの読み取り専用アクセス権を持つ必要があるメソッドを作成する場合は常に、引数をICustomerROとして入力してください。pojoへの読み取り/書き込みアクセス権が必要なメソッドがある場合は、引数をICustomerと入力します。いずれの場合も、Customerオブジェクトを渡します。これにより、誰がどのメソッドにアクセスできるかを制御し、使用状況に適したメソッドのみを表示するJavaエディターの機能を活用できます。

于 2012-08-20T01:50:08.537 に答える
1

OOP とは、契約を順守することです。メソッドのコントラクトがオブジェクトを変更しないと述べている場合、たとえ変更できたとしても変更すべきではありません。変更した場合、それはバグです。ビジネス オブジェクトを GUI に直接渡しても問題はありません。

もちろん、クラスは可能な限り不変になるように設計する必要がありますが、ほとんどのビジネス オブジェクトは不変ではなく、これを回避しようとすると扱いにくいソリューションになります。セッターを公開することについてまだ心配している場合、最善の解決策は、元の値のコピーを含む不変の転送オブジェクトを作成することです。

于 2012-08-20T01:23:42.277 に答える
0

モデルのインターフェイスを作成し、読み取り専用の impl を配布します。つまり、セッターで UnsupportedOperationException をスローするものと同様に、Collections.unmodifiableXXX()読み取り専用のアクセス許可を持つプロセスに渡します。

秘訣は、どの発信者がどの権限を持っているかを知ることです。ポジョに知らせたり、決定させたりしないでください。誰が誰で、誰がどのようなコピーを取得するかを登録できる、ある種のファクトリ クラスを使用します。

于 2012-08-19T11:27:17.827 に答える