Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:使用instanceof公开不同的对象方法_Java_Instanceof - Fatal编程技术网

Java:使用instanceof公开不同的对象方法

Java:使用instanceof公开不同的对象方法,java,instanceof,Java,Instanceof,我读过这篇文章,它说使用instanceof事先检查我的对象是什么是一种不好的做法 但我不知道在这种情况下如何做:我有一个API,它返回一个项目列表。此项目列表同时返回用户和管理员 如果我强制转换一个类似于(用户)项的项,那么当它遇到管理员时,我就会有一个ClassCastException for(Item item : items){ if (item instanceof User){

我读过这篇文章,它说使用instanceof事先检查我的对象是什么是一种不好的做法

但我不知道在这种情况下如何做:我有一个API,它返回一个项目列表。此项目列表同时返回用户和管理员

如果我强制转换一个类似于(用户)项的项,那么当它遇到管理员时,我就会有一个ClassCastException

for(Item item : items){                     
                if (item instanceof User){
                    ((User)item).getName());
                    ((User)item).getEmail());
                }
                else if (item instanceof Admin){
                    ((Admin)item).getName());
                    ((Admin)item).getEmailList().getPrimary());
                }                           
            }

因为它是一个API,所以我不能修改Item,Item没有child上的方法,电子邮件检索方法也不同。我还有其他选择吗?

用所有常用方法定义一个接口,让用户和管理员类实现它,并在这些情况下仅使用该接口访问对象

编辑(因为您无法更改API)

备选方案包括:

  • 坚持你目前的解决方案。这似乎是最好的交易

  • 定义一个接口,创建两个实现该接口的包装器类,并包装原始对象。从面向对象的角度来看,这更干净,但我认为这在您的情况下有点过大,但这取决于实际情况

  • 理论(!):您也可以使用反射,但不要这样做-这会使代码更加糟糕-尤其是当只有两种不同的编译时已知项子类型时


  • 使用所有常用方法定义一个接口,让用户和管理员类实现该接口,并在这些情况下仅使用该接口访问对象

    编辑(因为您无法更改API)

    备选方案包括:

  • 坚持你目前的解决方案。这似乎是最好的交易

  • 定义一个接口,创建两个实现该接口的包装器类,并包装原始对象。从面向对象的角度来看,这更干净,但我认为这在您的情况下有点过大,但这取决于实际情况

  • 理论(!):您也可以使用反射,但不要这样做-这会使代码更加糟糕-尤其是当只有两种不同的编译时已知项子类型时


  • 首先,您的代码没有任何效果。调用getter时没有任何赋值,因此实际上不使用getter的返回值

    其次,使用不同类型的元素进行集合是一种不好的做法。在您的ccase用户和管理员中


    第三,如果您甚至需要这样的集合,您可以使用其他模式来执行您需要的操作。例如,访问者模式看起来像是铸造的一个很好的选择

    首先,您的代码没有任何效果。调用getter时没有任何赋值,因此实际上不使用getter的返回值

    其次,使用不同类型的元素进行集合是一种不好的做法。在您的ccase用户和管理员中


    第三,如果您甚至需要这样的集合,您可以使用其他模式来执行您需要的操作。例如,访问者模式看起来像是铸造的一个很好的选择

    理想情况下,您可以将接口更改为Item,以便它公开方法,这样无论您是在代码中处理用户还是管理员,Item都可以定义getName()和getEmail(),而User和Admin都可以根据需要实现这些方法

    然而,由于您不控制您正在使用的API,因此您别无选择,只能按照现在的方式编写代码


    因此,参考文章提出的观点很好,但它假设您可以更改正在使用的类。

    理想情况下,您可以将接口更改为Item,这样它就公开了方法,这样无论您在代码中是与用户还是管理员打交道,Item都可以定义getName()和getEmail()用户和管理员根据需要实施这些方法

    然而,由于您不控制您正在使用的API,因此您别无选择,只能按照现在的方式编写代码


    因此,参考文章提出的观点很好,但它假设您可以更改正在使用的类。

    这是一个API,我不能修改User或Admin eitherOk,那么备选方案是:选项1:坚持使用当前解决方案。这似乎是最好的交易。选项2:定义一个接口,创建两个实现该接口的包装类,并包装原始对象。从面向对象的角度来看,这更干净,但我认为这有点过大。3.理论(!)选项:您也可以使用反射,但不要这样做-这会使代码更加糟糕-尤其是当只有两个不同的项目子类型时,您应该将您的注释移动到答案中,以供进一步参考:)这是一个API,我无法修改用户或管理员eitherOk,然后备选方案是:选项1:坚持当前的解决方案。这似乎是最好的交易。选项2:定义一个接口,创建两个实现该接口的包装类,并包装原始对象。从面向对象的角度来看,这更干净,但我认为这有点过大。3.理论(!)选项:您也可以使用反射,但不要这样做-这会使代码更加糟糕-尤其是当只有两个不同的项目子类型时,您应该将您的注释移动到答案中,以供进一步参考:)第一:您不知道没有副作用。此外,这是一个简短的示例,可能不是完整的代码。第二:它们属于Item类型。将这些元素放在同一个集合中是完全合适的。编写有副作用的getter是一种犯罪行为。我完全同意你的观点,但这并不意味着它不会发生。:-\。第一:你不能知道没有副作用。此外,这是一个简短的示例,可能不是完整的代码。第二:它们属于Item类型。将这些元素放在同一个集合中是完全合适的。编写有副作用的getter是一种犯罪