【问题标题】:Delegating of functionality to child classes in Java将功能委托给 Java 中的子类
【发布时间】:2012-11-14 00:45:15
【问题描述】:

我有一些对象模型(例如命令)可以编组为一些文本表示。我有两个选择:

  1. 假设 Command 的每个子类都将正确覆盖“toString”
  2. 使用每个孩子都应该实现的“marshal”和“unmarshal”方法创建接口。

哪种选择更适合这种委派?我的意思是,toString 的含义非常接近,但它并不能保证子类不使用 toString 的标准实现。

谢谢

【问题讨论】:

    标签: java oop inheritance interface


    【解决方案1】:

    你可以使用库类org.apache.commons.lang3.builder.ToStringBuilder。它提供具有所有属性值的深层toString。有一些设置。

    【讨论】:

      【解决方案2】:

      我认为使用显式方法的方法要优越得多。您已经大致确定了原因:

      假设 Command 的每个子类都会正确地覆盖“toString”

      每个接触代码的维护程序员都需要了解这个假设。如果他们突然决定某个类的toString() 包含一条额外的信息(比如调试)会很好,那么代码将意外中断。

      使用每个孩子都应该实现的“marshal”和“unmarshal”方法创建接口。

      这使得 API 明确,难以实现,并且更难意外破坏或误用。

      这也意味着某些错误可以在编译时被捕获。你可以有一个采用IMarshallable 的方法,编译器不会让你传递任何不实现接口的东西。对于第一种方法,每个对象都有一个toString() 方法,编译器无法知道特定对象的toString() 是否实现了您的编组协议。这意味着它无法在编译时诊断出此类错误。

      【讨论】:

      • Impossible to fail to implement”有点夸大其词。扩展 Command 接口的实现者的子类可能不会覆盖已经存在的 marshalunmarshal。此时,您要么最终反序列化/序列化基类的实例,要么获得子类的半生不熟的实例(取决于序列化的完成方式)。
      • @cHao:很公平。我正在考虑一个只有最终类实现编组的设置。我会修改措辞。
      【解决方案3】:

      我的意思是,toString 的意思很接近

      toString 的目的是为一个对象提供一个文本表示,它是供人阅读的,主要用于调试。 java.lang.Object.toString() 的 API 文档是这样说的:

      返回对象的字符串表示形式。通常,toString 方法返回一个“以文本方式表示”该对象的字符串。结果应该是一个简洁但信息丰富的表示,易于人们阅读。

      这并不意味着以某种机器可读的格式返回字符串,并且您可以再次转换回(解组)为对象。

      因此,toString() 并不意味着您似乎想要将其用于:将对象转换为字符串(编组),然后可以将其转换回对象(解组)。

      最好创建一个声明marshalunmarshal 方法的接口,并使需要此功能的类实现此接口。通过让类实现接口,也可以立即清楚该类支持此功能。

      【讨论】:

        【解决方案4】:

        我通常不会期望toString() 实现除诊断或类似功能之外的任何功能。

        我更愿意实现编组/解组机制。请注意,这可能非常强大。例如您将源/目的地作为参数提供给marshall()/unmarshall() 机制,并且对象可以与源/目的地进行调解,以一种或多种模式(本质上是 visitor 模式)编组自己。 /p>

        【讨论】:

          【解决方案5】:

          您绝对应该使用接口和/或抽象类(方法)。依赖 toString 是个坏主意。

          【讨论】:

            猜你喜欢
            • 2018-03-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-05-07
            • 1970-01-01
            • 2011-03-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多