将功能委托给Java中的子类

时间:2012-11-26 14:11:09

标签: java oop inheritance interface

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

  1. 假设Command的每个子类都将正确覆盖“toString”
  2. 使用“marshal”和“unmarshal”方法创建界面,每个孩子都应该实施这些方法。
  3. 哪种选择更适合此类授权?我的意思是,toString具有非常接近的含义,但它并不能保证子类只是不使用toString的标准实现。

    由于

5 个答案:

答案 0 :(得分:3)

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

  

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

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

  

使用每个孩子应该实施的“marshal”和“unmarshal”方法创建界面。

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

我宁愿实施马歇尔/联合国机制。请注意,这可能非常强大。例如您将源/目标作为marshall() / unmarshall()机制的参数提供,并且对象可以与源/目标进行调解以在一种或多种模式(主要是访问者模式)

答案 3 :(得分:0)

  

我的意思是,toString具有非常接近的含义

toString的目的是为对象提供文本表示,该对象旨在为人们阅读,主要用于调试。这就是java.lang.Object.toString()的API文档所说的内容:

  

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

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

因此,toString()并不意味着你似乎想要用它:将一个对象转换为一个字符串(marshal),以后可以转换回一个对象(unmarshal)。

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

答案 4 :(得分:0)

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