Java 在实例集合的情况下,如何用其类类型或接口替换instanceof

Java 在实例集合的情况下,如何用其类类型或接口替换instanceof,java,instanceof,visitor,choco,Java,Instanceof,Visitor,Choco,我有很多类,它们都是从类AbstractVariable派生的。我需要将它们收集到相应的列表中,因为我需要使用它们。将它们收集到一个列表中,然后按实例过滤它们可能更简单。不过,我不确定性能如何 public class VariableRecorder { private static List<Beacon> beacons = new LinkedList<>(); private static List<Engineer> engineers = ne

我有很多类,它们都是从类AbstractVariable派生的。我需要将它们收集到相应的列表中,因为我需要使用它们。将它们收集到一个列表中,然后按实例过滤它们可能更简单。不过,我不确定性能如何

public class VariableRecorder {

private static List<Beacon> beacons = new LinkedList<>();
private static List<Engineer> engineers = new LinkedList<>();
private static List<Heli> helis = new LinkedList<>();
private static List<Locatable> locatables = new LinkedList<>();
private static List<Location> locations = new LinkedList<>();




public static void record(AbstractVariable av) {
    if(av instanceof Engineer)
        engineers.add((Engineer) av);
    if(av instanceof Heli)
        helis.add((Heli) av);
    if(av instanceof Locatable)
        locatables.add((Locatable) av);
    if(av instanceof Location)
        locations.add((Location) av);
    if(av instanceof Beacon)
        beacons.add((Beacon) av);
}



}
公共类变量记录器{
私有静态列表信标=新LinkedList();
私有静态列表工程师=新建LinkedList();
私有静态列表helis=newlinkedlist();
private static List locatables=new LinkedList();
私有静态列表位置=新建LinkedList();
公共静态无效记录(AbstractVariable av){
if(工程师的av实例)
工程师。添加((工程师)av);
if(直升机的av实例)
直升机。添加((直升机)av);
if(可定位的av实例)
可定位。添加((可定位)av);
if(位置的av实例)
位置。添加((位置)av);
if(信标的av实例)
信标。添加((信标)av);
}
}
其中一些是类,一些是装饰器接口。Visitor看起来像是一个杀伤力过大的东西,因为它必须在所有类(包括子类)中声明,并且考虑到一个类可能有多个接口,维护将是可怕的

这不是类或接口的最终列表。它会变得更大

现在我真的在考虑getter过滤,因为这个选择只是在算法的最开始


问题是——在这个问题上,什么是最好的设计选择?访客?吸气剂过滤?维护不同的列表?或者其他一些设计模式?

在Google上查看访问者模式设计,作为一个小的介绍性说明,您需要在AbstractVariable类中创建一个accept(访问者)方法,该方法接收访问者实例并执行Visitor.visit(此)。然后在Visitor类中,只要AbstractVariable的子类存在,您就可以创建尽可能多的方法,每个方法都应该被称为visit(Subclass X),而Subclass X将是AbstractVariable的每个子类。最后,visit(SubclassX)方法需要在AbstractVariable上调用addSubclassx(SubclassX),这个方法应该负责将SubclassX的实例添加到相应的列表中

在Google上查看访问者模式设计,作为一个小的介绍性说明,您需要在AbstractVariable类中创建一个accept(访问者)方法,该方法接收访问者实例并执行Visitor.visit(此)。然后在Visitor类中,只要AbstractVariable的子类存在,您就可以创建尽可能多的方法,每个方法都应该被称为visit(Subclass X),而Subclass X将是AbstractVariable的每个子类。最后,visit(SubclassX)方法需要在AbstractVariable上调用addSubclassx(SubclassX),这个方法应该负责将SubclassX的实例添加到相应的列表中

你的问题是什么?经过编辑,这样会使情况变得更明朗一点,并添加了一个问题。这段代码似乎开始有味道了。你有一堆可变的全局变量,有几个类继承自一个公共接口,但该接口显然无法描述对象的功能。从
映射开始这听起来很像Joshua Bloch的“类型安全异构容器”,虽然列表的类型擦除意味着您必须将每个
列表的泛型类型映射到
列表本身。Neal Gafter的“”可能会帮你解决这个问题。(注意:Gafter与Joshua Bloch的THC模式的链接早已过时。Bloch在“泛型”(第29项)“枚举”前36分钟左右的“谈话”中对其进行了介绍。)您的问题是什么?编辑后,它会使情况变得更明朗,并添加了一个问题此代码似乎开始有味道。你有一堆可变的全局变量,有几个类继承自一个公共接口,但该接口显然无法描述对象的功能。从
映射开始这听起来很像Joshua Bloch的“类型安全异构容器”,虽然列表的类型擦除意味着您必须将每个
列表的泛型类型映射到
列表本身。Neal Gafter的“”可能会帮你解决这个问题。(注:Gafter与Joshua Bloch的THC模式的链接早已过时。Bloch在“泛型”(第29项)末尾“枚举”之前约36分钟的“谈话”中对其进行了阐述。)