2


对不起标题,我想不出一个更自我描述的。

在我正在开发的独立应用程序(这是一项大学作业)中,我面临着这个问题:
我的实体(或模型对象或业务对象等)只不过是 POJO。

自然会有(将有)许多类使用它们,但其中一些类不应该被允许修改它们的值(例如使用它们的设置器);我们可以说我需要将一个对象传递给具有不同权限的不同类:对某些类只读,对允许修改对象状态的其他类读写。

一个例子是一个只显示对象信息的 GUI 窗口:我想确保这个类完全不知道如何修改对象的状态。

我阅读了很多相关问题(只读接口、只读实现、防御性副本等)的主题,但我没有找到适合我的情况的任何内容。

假设我只想将对象的 setter 方法的访问权限授予特定的类,但我找不到实现此目的的方法。

我最初认为接口会很好(例如ReadOnlyObject,使用 getter 和WriteOnlyObjectsetter 并Object实现它们),但问题是WriteOnlyObject任何使用ReadOnlyObject. 除此之外,我不相信只用 getter 或 setter 编写接口是一个好习惯。

请帮忙!@_@

4

3 回答 3

1

OOP 就是遵守合同。如果一个方法的契约声明它不会修改一个对象,即使它可以修改它也不应该这样做——如果是这样,那就是一个错误。将业务对象直接传递给 GUI 并没有错。

当然,您应该尽可能将类设计为不可变的,但大多数业务对象都不是不可变的,试图解决这个问题会导致笨拙的解决方案。如果您仍然担心暴露 setter,最好的解决方案是创建一个包含原始值副本的不可变传输对象。

于 2012-08-20T01:23:42.277 回答
1

对于给定的 pojo,将其称为“客户”,您应该创建两个接口。创建一个名为 ICustomerRO 的接口,它只有 getter 方法。创建一个名为 ICustomer 的接口,该接口扩展了 ICustomerRO 并添加了 setter 方法。最后,使用功能齐全的 getter 和 setter 方法创建您的 pojo,并实现 ICustomer。

当然,您可以使用任何您喜欢的命名约定。

在您的代码中,无论您在何处创建对 pojo 具有只读访问权限的方法,请务必将参数键入为 ICustomerRO。当您有一个应该对 pojo 具有读写访问权限的方法时,将参数键入为 ICustomer。无论哪种情况,都传入一个 Customer 对象。这使您可以控制谁可以访问哪些方法,并利用 java 编辑器仅显示适合使用上下文的方法的能力。

于 2012-08-20T01:50:08.537 回答
0

使您的模型接口并分发只读实现 - 即在设置器中抛出 UnsupportedOperationException 的那些,类似于Collections.unmodifiableXXX()那些具有只读权限的进程。

诀窍是知道哪些调用者有什么权限。不要让 pojo 知道/决定。使用某种可以注册谁是谁以及谁获得什么样的副本的工厂类。

于 2012-08-19T11:27:17.827 回答