((Object)(this)).toString() 总是调用基本实现吗?



我有一个toString()的实现,它依赖于一些可能引发异常的代码。

在这种情况下,我想故障转移到默认的toString()方法。

为此,使用是否安全

catch (Exception e){
return ((Object)(this)).toString();
}

作为该异常的处理程序?换句话说,那将强制使用ObjecttoString()方法。

它似乎适用于我的情况,但我担心它不是标准的,可能会导致递归。

完全没有。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的版本可能并不理想。相反,也许可以生成一个包含异常含义的字符串。

最新更新