【问题标题】:Many classes use an object, but having different views of it许多类使用一个对象,但对它有不同的看法
【发布时间】:2012-08-19 11:04:44
【问题描述】:


抱歉标题,我想不出更自我描述的标题。

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

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

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

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

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

我最初认为接口会很好(例如 ReadOnlyObject 带有 getter 和 WriteOnlyObject 带有 setter 和 Object 实现它们)但问题是 WriteOnlyObject 接口很容易被任何类访问使用ReadOnlyObject。 除此之外,我不认为只使用 getter 或 setter 编写接口是一种好习惯。

请帮忙! @_@

【问题讨论】:

  • 您的业务对象可以实现接口,每个接口都提供一个 getter 方法的子集来访问业务对象的数据。

标签: java design-patterns interface readonly


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我只是想知道这一点,我得出了同样的结论(实际上,您建议的两种解决方案都是相反的顺序)。但我确实认为,为只有 getter 和 setter 的简单 POJO 创建接口几乎没有任何意义,并且任何使用模型对象的类都对它负责。谢谢卡萨布兰卡:)
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    使您的模型接口并将只读实现分发给那些具有只读权限的进程。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      相关资源
      最近更新 更多