我有一个toString()
的实现,它依赖于一些可能引发异常的代码。
在这种情况下,我想故障转移到默认的toString()
方法。
为此,可以安全使用
catch (Exception e){
return ((Object)(this)).toString();
}
作为该异常的处理程序?用命令的话来说,会强制使用Object
toString()
方法。
对于我来说,它似乎可以正常工作,但我担心它不是标准的,可能会导致递归。
答案 0 :(得分:4)
一点也不。 JVM根据要调用的方法的对象的确切类型来确定在运行时。
您的漂亮小投掷什么也做不了。因为您不能通过强制转换来更改引用的运行时类型!
一种解决方案是拥有类似的东西:
public String superToString() {
return super.toString();
}
放在此类中,并显式调用该方法。或者,当前可以进行强制转换的行当然可以替换为return super.toString()
。
但是然后,特别是选项1只会添加“更糟”。如:toString()
的约定将返回一个字符串。
仅从不编写toString()
方法
请参见How to use toString method in Java,以获取进一步的想法。
严重:在任何较大的项目中,您都归零控制何时toString()
在对象上调用频率/频率。您最好确保这些调用能够快速返回,返回合理的信息,并且永远不会抛出异常。
答案 1 :(得分:3)
不。如果这样做的话,那将击败运行时多态性,这是Java的基本功能之一(用于方法)。选择的方法取决于调用它的实际对象,而不取决于对该对象的引用类型(这是强制类型修改的对象)。
您可以使用super.toString()
,它会使用您超类的版本(可能是Object
的版本,但似乎足以满足您列出的用例)。
我有一个
toString()
的实现,它依赖于一些可能引发异常的代码。
如果是这种情况,我建议尽可能更改它。如果无法更改,建议您在toString
中生成对象后,将对象的字符串版本存储在上,这样以后的调用就不会太昂贵(引发异常的代价很高)。如果对象是可变的,并且修改了影响toString
的对象,则清除存储的字符串版本(以便下次重新构建)。通常,toString
应该简单快捷。
调用super
的版本可能不太理想。相反,也许生成一个包含异常含义的字符串。