我有一些可以编组为一些文本表示的对象模型(例如命令)。我有两个选择:
- 假设 Command 的每个子类都会正确地覆盖“toString”
- 使用每个孩子都应该实现的“marshal”和“unmarshal”方法创建接口。
对于这样的委派,哪种选择更好?我的意思是,toString 的含义非常接近,但它并不能保证子类不使用 toString 的标准实现。
谢谢
我有一些可以编组为一些文本表示的对象模型(例如命令)。我有两个选择:
对于这样的委派,哪种选择更好?我的意思是,toString 的含义非常接近,但它并不能保证子类不使用 toString 的标准实现。
谢谢
我认为使用显式方法的方法要优越得多。您已经大致确定了原因:
假设 Command 的每个子类都会正确地覆盖“toString”
每个接触代码的维护程序员都需要意识到这个假设。如果他们突然决定某个类toString()
包含一条额外的信息(比如调试)会很好,那么代码将意外中断。
使用每个孩子都应该实现的“marshal”和“unmarshal”方法创建接口。
这使得 API 明确,难以实现,并且更难意外破坏或误用。
这也意味着可以在编译时捕获某些错误。你可以有一个方法,IMarshallable
编译器不会让你传递任何不实现接口的东西。对于第一种方法,每个对象都有一个toString()
方法,编译器无法知道特定对象是否toString()
实现了您的编组协议。这意味着它无法在编译时诊断出这种类型的错误。
您绝对应该使用接口和/或抽象类(方法)。依赖toString是个坏主意。
我通常不会期望toString()
实现除诊断或类似功能之外的任何功能。
我宁愿实现一个编组/解组机制。请注意,这可能非常强大。例如,您将源/目的地作为参数提供给marshall()
/unmarshall()
机制,并且对象可以与源/目的地进行调解,以一种或多种模式(本质上是访问者模式)编组自己
我的意思是, toString 的含义非常接近
的目的toString
是为一个对象提供一个文本表示,它是供人们阅读的,主要用于调试。这就是 API 文档java.lang.Object.toString()
所说的:
返回对象的字符串表示形式。通常,toString 方法返回一个“以文本方式表示”该对象的字符串。结果应该是一个简洁但信息丰富的表示,易于人们阅读。
这并不意味着以某种机器可读的格式返回字符串,并且您可以再次将其转换回(解组)为对象。
因此,toString()
这并不意味着您似乎想要将它用于:将对象转换为字符串(编组),然后可以将其转换回对象(解组)。
最好创建一个声明marshal
和unmarshal
方法的接口,并使需要此功能的类实现此接口。通过使类实现接口,也可以立即清楚该类支持此功能。
你可以使用库类org.apache.commons.lang3.builder.ToStringBuilder
。toString
它提供了所有属性值的深度。有几个设置。