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

时间:2018-09-03 14:16:43

标签: java polymorphism tostring

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

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

为此,可以安全使用

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

作为该异常的处理程序?用命令的话来说,会强制使用Object toString()方法。

对于我来说,它似乎可以正常工作,但我担心它不是标准的,可能会导致递归。

2 个答案:

答案 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的版本可能不太理想。相反,也许生成一个包含异常含义的字符串。