根据对象拆分成列表,没有instanceof

时间:2018-09-07 14:02:06

标签: java list oop object instanceof

我要直奔这一点。

我有3节课。人,教授和学生。 (人物,教授,校友)。 教授和学生都来自Person。但是Person也可以实例化,因为它不是抽象的。

我有50个人,在列表中随机生成。可以是任何人,教授或学生。 我想将它们分别分成不同的列表。

此刻,我做到了:

event

专业是教授列表

alumnos是学生列表

nuevasPersonas是人员列表

哪个作品完美。但是有人告诉我不要使用instanceof,所以我不习惯。

关于如何在不使用instanceof的情况下将它们分成列表的任何想法?

谢谢。

4 个答案:

答案 0 :(得分:0)

我会使用instanceof,为什么不习惯呢?

无论如何,替代方案可能是在Person(= 0)中使用变量类型(带有getter,但没有setter),然后在Professor and Student中将其覆盖为1和2。 然后,您将测试变量而不是使用instanceof。

答案 1 :(得分:0)

还可以如下使用getClass()。getSimpleName():

public static void main (String[] args) throws java.lang.Exception
{
    List<Test1> list = new ArrayList<>(2);
    Test1 o1 = new Test1();
    list.add(o1);
    Test2 o2 = new Test2();
    list.add(o2);
    for (Test1 test : list) {
        System.out.println(test.getClass().getSimpleName());
    }
}
static class Test1{

}
static class Test2 extends Test1{

}

在for循环中,您可以使用if条件(如以下代码)来完成工作:

for (Test1 test : list) {
    String className = test.getClass().getSimpleName();
    if(className.equals("Test1")) {
       System.out.println("Test1");
    } else if(className.equals("Test2")) {
       System.out.println("Test2");
    }
    System.out.println();
}

根据覆盖方法的另一种解决方案是:

public static void main (String[] args) throws java.lang.Exception
{
    List<Test1> list = new ArrayList<>(2);
    Test1 o1 = new Test1();
    list.add(o1);
    Test2 o2 = new Test2();
    list.add(o2);
    for (Test1 test : list) {
        test.addToMyTypeList();
    }
    for(Test1 test : Test1.list) {
        System.out.println(test.getClass().getSimpleName());
    }
    for(Test1 test : Test1.list) {
        System.out.println(test.getClass().getSimpleName());
    }
}
static class Test1{
    public static List<Test1> list = new ArrayList<>();
    public void addToMyTypeList() {
        String className = test.getClass().getSimpleName();
        if(className.equals("Test1")) {
                    Test1.list.add(this);
        }
    }
}
static class Test2 extends Test1{
    public static List<Test1> list = new ArrayList<>();

    @Override
    public void addToMyTypeList() {
        String className = test.getClass().getSimpleName();
        if(className.equals("Test2")) {
                    Test2.list.add(this);
        }
    }
}

答案 2 :(得分:0)

也许您的老师希望您创建一个overriden method来回答问题isStudentisProfessor

但是,由于没有提供instanceof运算符无法提供的额外信息,因此这是一个人为设计的示例,其中添加这些冗余方法并不是一个好的设计决定。不幸的是,在初学者课程中,有时会遇到这样的人为设计的例子,这些例子为了教授特定的语言概念而过分简化。

答案 3 :(得分:0)

您可以使用每种对象类型重载“ add”方法-类似于以下代码。

main方法只是将三个不同Object的实例添加到ObjectSplitter类-将它们分离到不同的Collections中

map.values()

}