在一个新的 Java 项目中,我尝试应用尽可能多的最佳实践。我遇到的问题是不变性。虽然我理解了这个概念并且已经构建了一些不可变类,但我现在来到了一个我认为将它作为可变类来做更合适的类。
主要问题是我想在某些情况下隐藏类的可变部分,以便在我的情况下 MVC 的视图层不能直接修改对象,但必须通过其控制器。
我想到了两种方法:
创建一个包含所有不可变方法的接口“Thing”(只读)并创建一个包含设置器的接口“MutableThing”。
将所有方法放在一个接口中,并通过像 Collections.unmodifiableList(obj) 方法一样包装对象来限制对变异方法的访问,以便在访问变异方法时抛出异常。
我更喜欢第一个,因为我认为它更干净,设计得更好,但我有一个问题。我在“事物”接口中有 addListener(l) 和 removeListener(l),因此视图层可以将自己注册为某些模型对象的侦听器。但是在“Thing”接口中使用这两种方法,它本身就没有意义了。如果没有实际更改数据的方法,为什么接口能够注册通知数据更改的侦听器?我可以将这些方法放在“MutableThing”接口中,但视图层只能访问“Thing”接口,不能将自己注册为监听器。
这不起作用的原因仅仅是因为侦听器,视图层实际上是否负责将自己注册为模型上的侦听器?如果控制器可以以某种方式做到这一点(它可以访问“MutableThing”),那么就不会有问题,但我不知道如何实现它。
你有什么建议?
谢谢!