假设我有以下类层次结构:
public interface Result {
}
public class Failure implements Result {
private String msg;
public Failure(String msg) {
this.msg = msg;
}
@Override public String toString() { return msg; }
}
public class Success implements Result {
private int time, count;
public Success(int time, int count) { this.time = time; this.count = count; }
public int getTime() { return time; }
public int getCount() { return count; }
@Override public String toString() { return time + ", " + count; }
}
它基本上定义了一个具有两个具体类的接口(interface) Result:Success 和 Failure。
然后,我有一个返回结果的计算方法,根据结果我应该做一些事情,例如:
Result result = calculate();
我有几个选项来找出具体的类。最明显的一个是使用实例:
if (result instanceof Success) {
int time = result.getTime();
int count = result.getCount();
// Do something with them
} else {
throw new RuntimeException(result.toString());
}
在像 Scala 这样支持模式匹配的编程语言中,我可以使用这样的匹配
case Success =>
case Failure =>
但由于 Java 不支持它,我不确定最好的做法是什么。例如,我可以按如下方式扩展结果接口(interface):
public interface Result {
public boolean isSuccess();
public boolean isFailure();
public Success asSuccess();
public Failure asFailure();
}
然后将客户端代码写成:
if (result.isSuccess()) {
Success success = result.asSuccess();
int time = success.getTime();
int count = success.getCount();
// Do something with them
} else {
throw new RuntimeException(result.toString());
}
但在这种情况下,接口(interface)绑定(bind)到具体类,这也不好。
表示此类情况的最佳方式是什么?我真的不想将处理代码放在 Result 层次结构中,因为它实际上取决于客户端获取数据并做他们想做的任何事情,因此多态调度解决方案可能不是最好的。结果层次结构充其量是一个 数据类型封装,不是运算。
最佳答案
IMO,这是对“标记接口(interface)”模式的不当使用。您确实想使用接口(interface)定义的某些功能,然后不要将其作为标记。添加方法。要使其通用,您可能想知道 Result
的类型/类别,例如 Success、Error、Fatal、Warning 等...
您可以考虑制作一个枚举,enum ResultType
并在您的界面中,除了功能方法(getTime、getCount...
)之外添加一个 getType()
或者,只使用 abstract class Result
并声明一个 protected Type 类型
。
要确定具体类型并进行相应的操作,您可以考虑在这些枚举类型上使用case
语句。但是您不必将它们转换
为具体类型,因为您想要的所有功能都在接口(interface)/抽象类 Result
中定义。
抱歉缺少代码示例。现在不方便编码。
关于java - 在 Java 中处理具体类型时 instanceof 的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23829926/