0

(从一个大墙o'文本编辑下来以更好地总结)问题是:

我有一个 AbstractMyClass 的集合。这个集合中有许多具体的子类。每个子类还将包含一个特定类型对象的字段。AbstractMyClass 可能有十几个不同的孩子,每个孩子都有自己的对象字段。这些对象中的每一个都可能在 Object 之外没有共享的父类。

例如,MyClassA 可能有一个 String,MyClassB 可能有一个 Integer,MyClassC 可能有一个 MyCustomClass,等等。不幸的是,不同的对象是这样做的必要条件。

问题是,需要评估这个集合,并且在给定正确的条件集的情况下,必须提取、检查、操作、存储、搁置等 AbstractMyClass 中的对象以供以后操作。基于条件以及其中的 MyClass/对象类型,存在多种潜在操作,因此处理 MyClass 中的数据可能不可行,因为其他更集中的类(即管理线程池的类)可能需要对付他们。这让我需要处理一些非常不同的对象类型。这当然可以做到,但我想不出任何合理的干净或动态的方式来处理它。当然,您可以尝试以下方法:

  • 使用泛型,它可以消除一些子类,但是在该类之外,您不知道 Object T 是什么,也不知道如何处理它而无需更多麻烦。
  • 对所有内容进行类型检查,这是一个相当冗长和丑陋的条件,并且在引入新的对象类型时必须保持。
  • AbstractMyClass 中的委托,但这意味着要构建更多类来处理每个实例,并且委托可能无法处理所有必要的功能。
  • 一个包装对象,每个对象类型都有一个字段。是的,让我们对所有内容进行空检查。

你可以看到困境。是否有任何“好”的方法来处理这类事情,或者它只是 Java 无法直接处理的问题之一,因为它在运行时可能没有足够的信息,每个人都只是以不同的方式解决它?

4

1 回答 1

0

如果不确切知道必须对响应做什么,如果没有具体示例就很难回答,但我看到基本上有两种干净的 OO 解决方案。

第一个解决方案:良好的旧多态性:

public void handleResponse(AbstractResponse response) {
    response.handle();
}

简而言之,响应本身负责在收到响应时对其进行处理。响应知道自己的类型,并且可以访问自己的数据。

第二种解决方案:访问者模式,它允许外部化响应处理而无需进行 instanceof 检查和强制转换以了解响应的类型:

public interface ResponseVisitor {
    void visitA(ResponseA responseA);
    void visitB(ResponseB responseB);
}

public abstract class AbstractResponse {
    public abstract void accept(ResponseVisitor visitor);
    ...
}

public class ResponseA extends AbstractResponse {
    @Override
    public void accept(ResponseVisitor visitor) {
        visitor.visitA(this);
    }
}

public class ResponseB extends AbstractResponse {
    @Override
    public void accept(ResponseVisitor visitor) {
        visitor.visitB(this);
    }
}

public class TheResponseVisitorImplementation implements ResponseVisitor {
    @Override
    public void visitA(ResponseA responseA) {
        ...
    }

    @Override
    public void visitB(ResponseB responseB) {
        ...
    }
}

...

public void handleResponse(AbstractResponse response) {
    ResponseVisitor visitor = new TheResponseVisitorImplementation();
    response.accept(visitor);
}
于 2013-08-23T21:50:17.613 回答