ドメイン層がコントローラーによって UI から分離されている Java アプリケーションがあります。問題は、これらのコントローラーがドメイン オブジェクトを返すことができ、ドメイン オブジェクトをパラメーターとして持つことができることです。
これらの返されたドメイン オブジェクトの一部は変更可能であり、これを防止したいと考えています。UI(または将来のUI)がコントローラにアクセスせずにドメインを直接変更できないようにしたい.
私は2つのオプションを試しました:
最初のものでは、各クラスがゲッターのみを含む「変更不可能な」インターフェースを実装していることを確認しました。また、オブジェクトを UI に返す必要がある場合は、その「変更不可能な」インターフェイスを返しました。UI がゲッターのみを表示できるようにします。これに伴う問題は、それらがまだ元のオブジェクトに簡単にキャストでき、アクセスが得られることです。最初はこのレベルのセキュリティで十分だと思っていましたが、誰かが誤ってオブジェクトをキャストして間違った方法で使用し、整合性が侵害されたことがありました。
2 つ目では、返される可能性のある各オブジェクトに変更不可能なラッパーを提供しようとしました。しかし、問題は、これらの返されたオブジェクトがコントローラーのメソッドのパラメーターとして使用できるため、コントローラーでアンラップする必要があることです。
uwrap()
メソッドをパッケージ プライベートにしようとしましたが、特定のすべてのラッパー クラスをコントローラーと同じパッケージに配置する必要があり、これは少し不便です。
編集:3番目のオプション:
- ( vicに感謝します) 3 番目のオプションでは、オブジェクトは変更不可能なwrapperによってラップされますが、このラッパーによってラップを解除することはできません。各 Unmodifiable は、Hashmap 内のその変更可能なオブジェクトにリンクされています。したがって、「ラップ解除」は、変更不可能なオブジェクトにリンクされている変更可能なオブジェクトを取得することによって行われます。
オブジェクトを変更不可にしてコントローラーから返せるようにし、コントローラーに戻されたときに再度変更可能にする方法を知っている人やアイデアを持っている人はいますか?