java - 我应该使用继承吗?
问题描述
我有一个类,其中包含:
- 标题(类)
- 详细信息列表(类)
一个细节可以有 3 种类型,所有不同的属性。它们有两个共同的属性,所以我使用了继承。
问题是代码越来越难以维护,尤其是当我必须在 List 中获取详细信息时。我必须做这样的事情:
if(detail instanceof DetailType1){
something
}
else something
有替代方案吗?有什么推荐吗?
提前欣赏。
编辑:
List<String> values = new ArrayList<String>();
for (Detail detail : fFile.getDetails())
{
if (detail instanceof DetailType1)
{
values.add(fFile.getHeader().getEntity() + "-" + detail1.getType());
values.add(((DetailType1) detail).getServiceReference());
values.add(fFile.getHeader().getProcessedDate());
}
else if (detail instanceof DetailType3)
{
values.add(((DetailType3) detail).getClientCode());
values.add(((DetailType3) detail).getMaxAmount().toString());
values.add(((DetailType3) detail).getReference());
}
...
}
解决方案
一般来说,您是正确的,instanceof 是一种难闻的气味 - 修复它的方法是通过调用接口上的方法,该接口由您使用“instanceof”的所有对象实现。
这是我在您的情况下的看法:
DetailType1 和 3 应该使用如下方法实现相同的接口:
addToValues(List<String> values){}
他们每个人都以不同的方式实现这个接口,例如,DetailType1 应该看起来像这样(您可能还必须传入 fFile):
addToValues(List<String> values){
values.add(fFile.getHeader().getEntity() + "-" + getType());
values.add(getServiceReference());
values.add(fFile.getHeader().getProcessedDate());
}
然后,您的代码中的原始循环变为:
for(Detail detail : fFile.getDetails())
detail.addToValues(values);
推荐阅读
- flutter - 如何根据 --dart-define 参数构建具有不同图标的 Flutter 应用程序
- asp.net - Ocelot + consul + my web api (.Net 5) via HTTPS in docker
- macos - 创建devcontainer时如何获取ARM Docker镜像是VS Code?(麦克米1)
- json - 在这种加密数据的情况下,什么是 devideId?
- php - 计算时间在php中加在一起(H:i:s)
- npm - NPM 和生命周期操作顺序
- java - Ant 构建过程因错误而失败
- c# - 实际OOM和2GB对象OOM的区别?
- html - 悬停菜单边框底部消失
- php - 如果点在 Svg 形状内,我可以用 PHP 检查吗?