【发布时间】:2023-03-28 20:29:01
【问题描述】:
首先,对于那些厌恶、厌恶和鄙视instanceof 运算符的人,我理解您对它的担忧,但我一直坚持使用它。那是因为我无权完全重构另一个开发团队设置项目的方式,所以除非我在这里遗漏了一些东西,否则我看不到任何避免它的方法。
我有一个无法更改的 Java POJO,并允许您将 Exception 设置为其属性之一:
public class Message {
private Exception exception;
public void setException(Exception exc) {
this.exception = exc;
}
}
同样,我无法更改此 Message 类。
我正在编写一个错误处理程序方法,该方法通过MessageContainer 实例,我需要根据容器的Message 上设置的异常类型 来执行不同操作的逻辑:
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 而不是可注入的 Message 实例这一事实。
所以,即使我真的不喜欢使用instanceof,我也看不出有任何其他方法可以完成这个逻辑(但无论如何,请提出建议......只要他们不涉及更改Message、MessageContainer 或handle(MessageContainer) 方法!)。
但即使使用instanceof,这段代码又是如何工作的?一旦您将Exception 从Message 中拉出,我认为任何instanceofs 都不会触发,因为它会转换为Exception,无法检测它是否是BuzzException,@ 987654341@等。我在这里有什么选择?提前致谢。
【问题讨论】:
标签: java exception casting instanceof