JAVA-返回两种可能的对象类型
我需要返回两种可能的对象类型,具体取决于功能。
public ? returnBooleanOrString(){
if(validation)
return "String";
else
return false;
}
有任何想法吗?
回答
对您的问题的快速而肮脏的答案是返回两种类型中的最大下限,即最具体的常见超类。对于String和Boolean,那是Object。
public Object returnBooleanOrString(){
if(validation)
return "String";
else
return false;
}
但是等等,这几乎肯定不是你想要的。
如果您来自动态语言,则需要开始考虑类型。类型是你对调用者做出的承诺。如果你返回Object,你承诺“我会返回一个存在的东西”,没有进一步的信息。您需要做的是问问自己您打算让来电者使用这些信息做什么。String并且Boolean没有任何共同点,除了所有对象都有的共同点。
如果您打算让调用者检查事物是否为真,并且这是您唯一关心的事情,那么只需返回一个布尔值
public boolean returnBooleanOrString() {
if (validation)
return true;
else
return false;
}
如果您打算返回一个“可选”值(即该值可能存在也可能不存在,那么您需要 Optional
public Optional<String> returnBooleanOrString() {
if (validation)
return Optional.of("String");
else
return Optional.empty();
}
现在,调用者被迫在尝试对其进行String操作之前检查该值是否存在。我们已经恢复了类型安全。
如果您打算传达更复杂的信息,请考虑创建自己的继承层次结构。
public interface MyReturnType {
public void someOperation();
}
public class Success implements MyReturnType {
public String value;
public Success(String value) {
this.value = value;
}
public void someOperation() { ... }
}
public class Failure implements MyReturnType {
public boolean value;
public Failure(boolean value) {
this.value = value;
}
public void someOperation() { ... }
}
public MyReturnType returnBooleanOrString() {
if(validation)
return new Success("String");
else
return new Failure(false);
}
然后,您可以将您的界面限制为对您的字符串布尔混合值进行任何有意义的操作。