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