返回
程序员如何从检查异常的困扰中走出来?
Android
2023-11-26 08:44:11
当谈到 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)");
}
}
当我们调用这个函数时,它将打印一个人的名字,无论这个人是人类还是宠物。
密封接口允许我们创建联合类型,而无需使用检查异常。这使得我们的代码更加简洁和易于阅读。
我希望这篇文章对你有帮助!