我有一个toString()
的实现,它依赖于一些可能抛出异常的代码。
在这种情况下,我想故障转移到默认的toString()
方法。
为此,使用是否安全
catch (Exception e){
return ((Object)(this)).toString();
}
作为该例外的处理程序?按顺序说,那将强制使用Object
toString()
方法。
它似乎适用于我的情况,但我担心它不标准,可能会导致递归。
一点也不。 JVM在运行时根据要调用的方法的确切类型确定。
你漂亮的小铸造确实没有任何成就。因为您无法通过强制转换来更改引用的运行时类型!
一个解决方案是拥有类似的东西:
public String superToString() {
return super.toString();
}
在这些类中,并显式调用该方法。或者,当然可以用return super.toString()
替换当前进行该演员阵容的线。
但是,特别是选项1只会增加“糟糕到坏”。如:toString()
的合同是返回一个字符串。
简直永远不会写toString()
方法
有关进一步的想法,请参阅How to use toString method in Java。
说真的:在任何较大的项目中,你都无法控制在对象上调用toString()
的时间/频率/方式。您最好确保这些调用快速返回,返回合理的信息,并且永远不会抛出异常。
没有。如果确实如此,那将破坏运行时多态性,这是Java的基本功能之一(对于方法)。选择的方法取决于您调用它的实际对象,而不是您对对象的引用类型(这是Cast修改的内容)。
您可以使用super.toString()
,它将使用您的超类的版本(可能是也可能不是Object
的版本,但似乎足以满足您列出的用例)。
我有一个
toString()
的实现,它依赖于一些可能抛出异常的代码。
如果是这种情况,我建议尽可能更换它。如果不能改变它,那么我建议在toString
中生成对象的字符串版本后,将对象的字符串版本存储在后面,以便后续调用不昂贵(引发异常是昂贵的)。如果对象是可变的,则清除存储的字符串版本,并修改影响toString
的内容(以便下次重建)。一般来说,toString
应该简单快速。
调用super
的版本可能并不理想。相反,也许生成一个包含异常感的字符串。