我有一些对象模型(例如命令),它可以编组为某些文本表示。我有两个选择:
哪种选择更适合此类授权?我的意思是,toString具有非常接近的含义,但它并不能保证子类只是不使用toString的标准实现。
由于
答案 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)。
创建一个声明marshal
和unmarshal
方法的接口要好得多,并且使需要此功能的类实现此接口。通过使类实现接口,还可以立即清楚该类支持此功能。
答案 4 :(得分:0)
U可以使用库类org.apache.commons.lang3.builder.ToStringBuilder
。它提供具有所有属性值的深toString
。有一些设置。