Java,子类中不同的对象字段,以及如何以最轻松的方式使用它们

Java,子类中不同的对象字段,以及如何以最轻松的方式使用它们,java,class,generics,dynamic,types,Java,Class,Generics,Dynamic,Types,(为了更好地总结,从一堵大墙上往下编辑)问题是这样的: 我有一个AbstractMyClass的集合。此集合中有许多具体的子类。每个子类还将包含特定类型对象的字段。AbstractMyClass可能有十几个不同的子类,每个子类都有自己的对象字段。这些对象中的每一个都可能在对象之外没有共享的父类 例如,MyClassA可能有一个字符串,MyClassB可能有一个整数,MyClassC可能有一个MyCustomClass,等等。不幸的是,在这样做的过程中,不同的对象是必不可少的 问题是,需要对这个集

(为了更好地总结,从一堵大墙上往下编辑)问题是这样的:

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

例如,MyClassA可能有一个字符串,MyClassB可能有一个整数,MyClassC可能有一个MyCustomClass,等等。不幸的是,在这样做的过程中,不同的对象是必不可少的

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

  • 使用泛型,它可以消除一些子类,但在 在那个类中,您不知道对象t是什么,也不知道如何处理它而不需要更多的麻烦
  • 每样东西都要进行打字检查,这会导致一个冗长而难看的过程 有条件的,如果需要新的对象类型,则必须维护 介绍
  • AbstractMyClass中的委托,但这意味着需要更多的类 构建以处理每个实例,而代理可能无法 处理所有必要的功能
  • 每个对象类型都有一个字段的包装器对象。耶,我们走吧 检查一切

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

如果没有具体的例子,如果不知道您必须对响应做什么,很难回答,但我看到的基本上有两种干净的面向对象解决方案

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

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);
}

第一个基本上是将操作委托给响应,但我认为这只能完成其他类可能仍然需要了解这些对象以及如何最好地处理它们的任务,即,将这些对象塞进一个“to-do”排序列表中,以便稍后包含在线程池中。访问者很有趣,但可能仍然会遇到同样的问题:事情是可以处理的,但是如果数据需要存储以供其他类稍后使用/操作,那么您仍然可能遇到同样的问题。当然,我可能把整个事情搞得太复杂了。。。