1

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

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

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

谢谢

4

5 回答 5

3

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

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

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

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

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

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

于 2012-11-26T14:11:58.437 回答
1

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

于 2012-11-26T14:13:58.817 回答
0

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

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

于 2012-11-26T14:16:48.083 回答
0

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

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

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

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

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

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

于 2012-11-26T14:18:24.143 回答
0

你可以使用库类org.apache.commons.lang3.builder.ToStringBuildertoString它提供了所有属性值的深度。有几个设置。

于 2019-12-09T12:14:08.767 回答