为了账号安全,请及时绑定邮箱和手机立即绑定

基于对象拆分为列表,不使用 instanceof

基于对象拆分为列表,不使用 instanceof

UYOU 2021-09-03 21:22:23
我直接进入正题。我上了3节课。人,教授和学生。(角色,教授,校友)。教授和学生都从 Person 扩展。但是 Person 也可以被实例化,因为它不是抽象的。我有 50 人,随机生成在一个列表中。它可以是任何类型的教授或学生。我想将它们分别分成不同的列表。目前,我是这样做的:for(Persona persona : personas) {        if(persona instanceof Profesor) {            profesores.add((Profesor) persona);        }        else if(persona instanceof Alumno) {            alumnos.add((Alumno) persona);        }        else {            nuevasPersonas.add(persona);        }    }profesores 是教授名单校友是学生名单nuevasPersonas 是人员列表哪个工作完美。但是有人告诉我不要使用instanceof,所以我不习惯。关于如何在不使用 instanceof 的情况下将它们分成列表的任何想法?谢谢。
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

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

无论如何,另一种方法可能是拥有一个变量类型(带有 getter,但没有 setter),亲自(=0),并在教授和学生中将其覆盖为 1 和 2。然后,您将测试变量而不是使用 instanceof。


查看完整回答
反对 回复 2021-09-03
?
慕容森

TA贡献1853条经验 获得超18个赞

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


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


public class ObjectSplitter {


public static void main(String ... args){


    ObjectSplitter d = new ObjectSplitter();

    d.addToCollection(new Object1());

    d.addToCollection(new Object1());

    d.addToCollection(new Object2());

    d.addToCollection(new Object1());

    d.addToCollection(new Object1());

    d.addToCollection(new Object1());

    d.addToCollection(new Object2());

    d.addToCollection(new Object3());

    d.addToCollection(new Object1());


    System.out.println("Num Ob1s : " + d.getOb1sSize());

    System.out.println("Num Ob2s : " + d.getOb2sSize());

    System.out.println("Num Ob3s : " + d.getOb3sSize());


}


private List<Object1> ob1s = new ArrayList<>();

private List<Object2> ob2s = new ArrayList<>();

private List<Object3> ob3s = new ArrayList<>();


void addToCollection(Object1 o){

    ob1s.add(o);

}


void addToCollection(Object2 o){

    ob2s.add(o);

}


void addToCollection(Object3 o){

    ob3s.add(o);

}


int getOb1sSize(){

    return ob1s.size();

}


int getOb2sSize(){

    return ob2s.size();

}


int getOb3sSize(){

    return ob3s.size();

}


static class Object1 {


}



static class Object2 extends Object1 {


}


static class Object3 extends Object2 {


}

}


查看完整回答
反对 回复 2021-09-03
?
holdtom

TA贡献1805条经验 获得超10个赞

您也可以使用 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);

        }

    }

}


查看完整回答
反对 回复 2021-09-03
  • 3 回答
  • 0 关注
  • 169 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号