首先,对于那些厌恶、厌恶和鄙视 instanceof
运算符的人,我理解您对它的担忧,但我一直坚持使用它。那是因为我无权完全重构另一个开发团队设置项目的方式,所以除非我在这里遗漏了一些东西,否则我看不到任何避免它的方法。
我有一个无法更改的 Java POJO,并允许您将 Exception
设置为其属性之一:
public class Message {
private Exception exception;
public void setException(Exception exc) {
this.exception = exc;
}
}
同样,我无法更改此 Message
类。
我正在编写一个错误处理程序方法,该方法会传递 MessageContainer
实例,并且我需要逻辑来根据容器上设置的异常类型来执行不同的操作消息
:
public class ErrorHandler {
public void handle(MessageContainer container) {
Message msg = container.getMessage();
Exception exc = msg.getException();
if(exc instanceof FizzException)
System.out.println("Do x");
else if(exc instanceof BuzzException)
System.out.println("Do y");
else
System.out.println("Do z");
}
}
同样,我无法改变 ErrorHandler#handle
传递的是 MessageContainer
而不是可注入(inject)的 Message
实例的事实。
所以,即使我真的不喜欢使用 instanceof
,我没有看到任何其他方法来完成这个逻辑(但无论如何,请提出建议......只要因为它们不涉及对 Message
、MessageContainer
或 handle(MessageContainer)
方法进行更改!)。
但是即使使用 instanceof
,这段代码是如何工作的呢?一旦您从 Message
中取出 Exception
,我认为任何 instanceof
都不会触发,因为它会强制转换为 Exception
,无法检测它是否是 BuzzException
、FizzException
等。我在这里有什么选择?提前致谢。
最佳答案
此代码将按预期工作。在运行时,instanceof
语句将比较 exc
的实际类型,而不仅仅是假设这只是一个 Exception
。如果唯一有效的语句是 exc instanceof Exception
,那么 instanceof
将完全毫无值(value):)
另一个解决方案(我会避免使用)是比较完全限定的类名:
String fqcn = exc.getClass().getName();
if (fqcn.equals("com.foo.FizzException") {
// etc.
}
关于java - 使用instanceof和casting获取原始Java类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14528261/