新しいJavaプロジェクトでは、可能な限り多くのベストプラクティスを適用しようとしています。私が問題を抱えているのは不変性です。概念を理解し、すでにいくつかの不変クラスを構築しましたが、今では、可変クラスとして実行する方が適切だと思うクラスに到達しました。
主な問題は、場合によってはクラスの可変部分を非表示にして、MVCのビューレイヤーがオブジェクトを直接変更できず、コントローラーを経由する必要があることです。
私はそれを行う2つの方法を考えました:
すべての不変メソッドを含むインターフェース「Thing」(読み取り専用)を作成し、セッターを含むインターフェース「MutableThing」を作成します。
すべてのメソッドを1つのインターフェイスに配置し、Collections.unmodizableList(obj)メソッドのようにオブジェクトをラップして、変更メソッドへのアクセスを制限し、変更メソッドにアクセスするときに例外がスローされるようにします。
私はそれがよりきれいでよりよく設計されていると思うので最初のものを好むでしょう、しかし私はそれに1つの問題があります。「Thing」インターフェースにaddListener(l)とremoveListener(l)があるので、ビューレイヤーはそれ自体をいくつかのモデルオブジェクトのリスナーとして登録できます。しかし、「Thing」インターフェースのこれら2つのメソッドでは、それだけでは意味がなくなります。実際にデータを変更する方法がない場合、インターフェイスにデータの変更を通知するリスナーを登録する機能があるのはなぜですか?これらのメソッドを「MutableThing」インターフェイスに配置することはできますが、ビューレイヤーは「Thing」インターフェイスにしかアクセスできず、リスナーとして登録できませんでした。
これが機能しない理由は、リスナーのせいだけですが、ビューレイヤーは、モデルのリスナーとして自分自身を登録する責任が実際にありますか?コントローラがなんとかして(「MutableThing」にアクセスできる)それを行うことができれば、問題はありませんが、それを実現する方法がわかりません。
あなたは何を提案しますか?
ありがとう!