今天程序员打V在工作的时候遇到一个问题,那就是我们要如何让一个函数返回各种不同类型的数据?
先来看看这个例子:
public Member getMember() {
// 一串获取Member数据的代码
}
可以看到上面这个函数会返回一个Member对象。但是如果执行失败的时候,我们应该返回什么?
有的人会说,我们可以返回 null 来表示执行失败。可是,这样还是会有一个问题,失败的原因千百种,我们如果要知道失败的原因,就需要返回失败信息,可是这个函数只能返回Member对象,我们该怎么返回失败信息呢?
有一个好方法,那就是封装我们的返回结果。
我们可以把要返回的对象跟信息一起封装成一个新的对象之后再返回。如此一来,调用者就可以根据需要从返回的封装对象中取出目标对象或者信息了。
示例代码:
// 封装结果的类
public class Result {
private Member member;
private String message;
// getters and setters
}
这时候还有一个问题,我们可以看到这个Result类只能装载Member对象,如果我们有另一个函数返回的对象是Customer,难道我还需要再写一个新的 Result 类来封装 Customer 吗?
其实不用,我们可以利用Java泛型来将我们的Result类改写成适用于任何对象。
// 适用于任何目标对象的封装结果类
public class Result<T> {
private T item;
private String message;
// getters and setters
}
如此一来,我们就可以利用泛型来告诉编译器,我们想要封装起来的返回对象是什么。
接着,以后我们的服务层就可以改写成如下这样:
public static Result<Member> getMember(int id) {
Result<Member> result = new Result<>();
Member member = getMemberFromDB(int id);
if (member == null) {
result.setMessage("从数据库中找不到该会员");
} else {
result.setMessage("成功");
result.setItem(member);
}
return result;
}
public static void main(String[] args) {
Result<Member> result = getMember(1);
if (result.getMessage().equals("成功")) {
Member member = result.getItem();
System.out.println(member.getName());
} else {
String errorMessage = result.getMessage();
System.out.println(errorMessage);
}
}
由此可见,将返回结果封装起来,可以给我们带来很大的灵活性。当要返回的信息多种多样的时候,我们就可以考虑用这种方式来封装我们的返回结果了。