【问题标题】:Checking whether object has changed (preserving good class design)检查对象是否已更改(保持良好的类设计)
【发布时间】:2012-08-23 12:53:58
【问题描述】:

我有称为“层次结构”的对象,基本上只是一个字符串列表,例如。 [1 2 3 4]。我还有一个名为 FormattedHierarchies 的对象,它们应该始终以用户希望它们表示的方式保持层次结构的格式化版本,例如(1-4) 或 {1,2,3,4}。

我的问题是这样的:

我想在层次结构发生更改时立即更新 FormattedHierarchy(例如,如果层次结构从 [1 2 3 4] 更改为 [1 2 3],则 FormattedHierarchy 应从 (1-4) 更改为 (1-3 ))。

谷歌搜索发现http://docs.oracle.com/javase/tutorial/uiswing/events/changelistener.html 但我的问题是:如果我想让 Hierarchy 实现 ChangeListener,它必须实现方法“stateChanged”。

类型层次结构必须实现继承的抽象方法 ChangeListener.stateChanged(ChangeEvent)

让 Hierarchy 创建一个新的 FormattedHierarchy 是不可行的,我也认为这不是好的类设计。这是因为层次结构随后会实现处理其格式的东西(尽管是以间接方式)。

这个问题有什么标准的或聪明的解决方案吗?

【问题讨论】:

  • 为什么不直接使用标志(例如isModified)?
  • 因为我希望自动更新更改,所以我宁愿有一个 isChanged 方法,只要在层次结构上使用 setter 就会调用它。它可能会产生我不知道或无法预见的影响 每当使用 setter 时让 setter 调用 isChanged 方法有什么缺点吗?

标签: java object-oriented-analysis


【解决方案1】:

我会尽量避免让两个对象完全同步。我可以建议你三种方式:

  1. 让调用Hierarchy setter 的人也对FormattedHierarchy 调用refresh() 方法。如果您从一个或很少几个地方调用 setter,这很容易。
  2. 仅在需要时重新计算Hierarchy 的字符串表示,而不存储它。您需要存储格式,而不是实际的格式化结果。
  3. Hierarchy 维护一个版本计数,每次更改时都会递增。 FormattedHierarchy 保存格式化的字符串,以及它看到的最后一个版本计数。当您向 FormattedHierarchy 询问字符串时,它首先会检查版本计数是否已更改,如果发生更改,则会触发格式化字符串的重新计算。

【讨论】:

  • 欣赏答案 - 所有方法都可能有助于其他查找相关问题的人。如果有人想出对列表的补充,请发表评论。编辑:让两个对象完全同步有什么问题?
  • 我不确定这是否不好,但根据我的经验,这是一种痛苦。如果你开始需要它,它对于多线程来说真的很糟糕。
【解决方案2】:

您不能简单地将Hierarchy 类与FormattedHierarchy 合并,如果需要,为您的不同消费者使用两个不同的接口吗?

通过这种方式,您只需在您的类中创建特定的设置器,当设置完成时,它们会将字符串 [1 2 3 4](1-4) 修改为 [1 2 3](1-3)

【讨论】:

  • 这有其优点,因为我只需要一个 setter,但我不太热衷于合并数据和表示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 2010-12-29
  • 2011-10-10
  • 2017-11-25
  • 2013-08-11
  • 2014-06-30
  • 1970-01-01
相关资源
最近更新 更多