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