返回

程序员如何从检查异常的困扰中走出来?

Android




当谈到 Java 的检查异常时,联合类型可能是一个令人惊讶的话题。毕竟,Java 从来没有真正支持联合类型,对吧?那么,我们如何通过检查异常来使用联合类型呢?

让我们从一个简单的例子开始。假设我们有一个 Person 类,它可以代表人类或宠物。

public class Person {
    private String name;
    private boolean isHuman;

    public Person(String name, boolean isHuman) {
        this.name = name;
        this.isHuman = isHuman;
    }

    public String getName() {
        return name;
    }

    public boolean isHuman() {
        return isHuman;
    }
}

现在,我们想创建一个函数来打印一个人的名字。如果这个人是人类,我们就想打印他们的全名。如果这个人是宠物,我们就想打印他们的名字和 "宠物"。

我们可以通过使用检查异常来实现这一点。

public void printName(Person person) throws IllegalArgumentException {
    if (person.isHuman()) {
        System.out.println(person.getName());
    } else {
        throw new IllegalArgumentException("Person is not human");
    }
}

当我们调用这个函数时,如果我们传递了一个人类对象,它将打印该人类的名字。如果我们传递了一个宠物对象,它将抛出一个 IllegalArgumentException。

我们可以通过使用密封接口来避免这种异常。

public sealed interface Person permits Human, Pet {}

public final class Human implements Person {
    private String name;

    public Human(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public boolean isHuman() {
        return true;
    }
}

public final class Pet implements Person {
    private String name;

    public Pet(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public boolean isHuman() {
        return false;
    }
}

现在,我们可以使用密封接口来重写 printName() 函数。

public void printName(Person person) {
    if (person instanceof Human) {
        System.out.println(((Human) person).getName());
    } else if (person instanceof Pet) {
        System.out.println(((Pet) person).getName() + " (pet)");
    }
}

当我们调用这个函数时,它将打印一个人的名字,无论这个人是人类还是宠物。

密封接口允许我们创建联合类型,而无需使用检查异常。这使得我们的代码更加简洁和易于阅读。

我希望这篇文章对你有帮助!