java - 使用instanceof和casting获取原始Java类

标签 java exception casting instanceof

首先,对于那些厌恶、厌恶和鄙视 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,我没有看到任何其他方法来完成这个逻辑(但无论如何,请提出建议......只要因为它们不涉及对 MessageMessageContainerhandle(MessageContainer) 方法进行更改!)。

但是即使使用 instanceof,这段代码是如何工作的呢?一旦您从 Message 中取出 Exception,我认为任何 instanceof 都不会触发,因为它会强制转换为 Exception,无法检测它是否是 BuzzExceptionFizzException 等。我在这里有什么选择?提前致谢。

最佳答案

此代码将按预期工作。在运行时,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/

相关文章:

java - 有没有办法完全重置 Ignite 状态?

objective-c - @autorelease 指令和异常处理

Java-DOM-Parser : Exception on Transformer. 转换

java - Java中如何按位置拆分字符串

java - java中的迭代

java - 类型安全 : Unchecked cast from Object to ArrayList<MyVariable>

c++ - 在计算过程中将 int 类型转换为 long long 有什么好处?

java - 将 java.sql.Connection 转换为 com.mysql.jdbc.Connection

java - 在 Java 中计算 Phi 系数

php - 在 Laravel 中显示错误页面?