java - 在 Java 中处理具体类型时 instanceof 的替代方法

标签 java inheritance instanceof

假设我有以下类层次结构:

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/

相关文章:

java - 为什么这个 instanceof 代码可以工作并且不会导致编译时错误?

java - Java 对我的 "equals"实现做了什么?

java - 类不继承自扩展至 JComponent 的类

java - 无法更改应用程序图标。 (Studio从xml文件中选取它)有

java - CRUDRepository 中的 Update 或 saveorUpdate

java - Spring Boot 应用程序的 loader.path 是否支持通配符模式

c++ - dynamic_cast 理解

python - 如何正确使用多重(重新)继承

scala - 如何知道一个对象是否是TypeTag类型的实例?

java - 当我将 localhost 更改为服务器上的主机时,为什么会出现错误?