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

问题描述 投票:1回答:2

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

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

为此,使用是否安全

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

作为该例外的处理程序?按顺序说,那将强制使用Object toString()方法。

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

java polymorphism tostring
2个回答
4
投票

一点也不。 JVM在运行时根据要调用的方法的确切类型确定。

你漂亮的小铸造确实没有任何成就。因为您无法通过强制转换来更改引用的运行时类型!

一个解决方案是拥有类似的东西:

public String superToString() {
  return super.toString();
} 

在这些类中,并显式调用该方法。或者,当然可以用return super.toString()替换当前进行该演员阵容的线。

但是,特别是选项1只会增加“糟糕到坏”。如:toString()的合同是返回一个字符串。

简直永远不会写toString()方法

  • 需要大量的密集工作才能发生或
  • 可以抛出异常!

有关进一步的想法,请参阅How to use toString method in Java

说真的:在任何较大的项目中,你都无法控制在对象上调用toString()的时间/频率/方式。您最好确保这些调用快速返回,返回合理的信息,并且永远不会抛出异常。


3
投票

没有。如果确实如此,那将破坏运行时多态性,这是Java的基本功能之一(对于方法)。选择的方法取决于您调用它的实际对象,而不是您对对象的引用类型(这是Cast修改的内容)。

您可以使用super.toString(),它将使用您的超类的版本(可能是也可能不是Object的版本,但似乎足以满足您列出的用例)。

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

如果是这种情况,我建议尽可能更换它。如果不能改变它,那么我建议在toString中生成对象的字符串版本后,将对象的字符串版本存储在后面,以便后续调用不昂贵(引发异常是昂贵的)。如果对象是可变的,则清除存储的字符串版本,并修改影响toString的内容(以便下次重建)。一般来说,toString应该简单快速。

调用super的版本可能并不理想。相反,也许生成一个包含异常感的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.