【问题标题】:Adding attributes to existing object向现有对象添加属性
【发布时间】:2018-10-23 18:21:13
【问题描述】:

我有一个现有的 REST 应用程序,它将 POJO(例如贸易对象)缓存到 ehcache,许多其他应用程序正在使用它。有些人正在将该 Trade 对象发送到 REST 服务,以便将其持久化到缓存和数据库中,有些人正在使用 REST 服务对此缓存进行获取操作。

public class Trade implements Serializable {
    private static final long serialVersionUID = -92565215465632589L;
    private String tradeNo = new String();
    private String isin = new String();
    private String quantity = new String();

.... //getters and setters 
}

现在我想在我们的应用程序中再添加一个组件,它使用上述许多交易属性,并且我还想添加许多新组件作为功能的一部分。我不想为现有的 Trade POJO 添加新属性,因为它也会影响现有代码。我应该创建新的 POJO 来扩展 Trade 并添加新属性并将这个新的 POJO 持久化到缓存中吗?使用这种方法,我将在缓存中拥有几乎相似的对象:-(。还有其他好的方法或设计模式可用吗?

public class ExtendedTrade extends Trade {
    private String operation = new String();
    private String dealType = new String();
    private String identifier = new String();

.... //getters and setters 
}

上面是我在方法中描述的ExtendedTrade

还请建议任何设计,以便我可以避免缓存这种类似类型的对象。

【问题讨论】:

  • 你有一种用new String();初始化字符串的奇怪风格。
  • 如果没有任何多态要求,则将Trade 设为新类的成员。

标签: java oop object design-patterns state


【解决方案1】:

嵌入(可能使用委托模式)在某些情况下似乎更可靠。

public class ExtendedTrade {
    private Trade trade;
    private String operation = "";
    private String dealType = "";
    private String identifier = "";

.... //getters and setters 
}

考虑:

  • 现有 Trade 是否可以扩展到 ExtendedTrade(摘要)。
  • ExtendedTrade2 是否存在,具有其他属性。
  • 是否需要修补 Trade 的现有属性。

我当然不会坚持这样更好。

【讨论】:

  • 这对我来说似乎很好,因为 new String() 有点奇怪
  • @MikeTung 已更正(在原始问题中),为类的常量池中的常量保存 3 个构造函数调用。
  • 如果在构造函数中我们只是默认值可能会更好?
  • @MikeTung 确实: 字段初始化不会发生在序列化中,因此瞬态字段无论如何都会被清空。此外,每个构造函数中的字段初始化代码都是重复的,对于大约 50 个字段,这会使类有些膨胀。
猜你喜欢
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多