在Java中使用子类项列表时,如何避免降频?

我有一个抽象类A和类B和C,类B和C扩展了A,我需要把列表中的B和C固定在一起,比如说List。但是,B和C有独特的方法,所以并不是List中的所有项都可以用来调用某些方法的。除非我是在降调 这被认为是一种设计气味。

我需要将B和C保持在同一个列表中,因为我想根据它们的共享属性进行排序,我可以这样做。在这种情况下,把它们保持在同一个父类型的列表上,然后降序是否是一个不好的设计?

解决方案:

我需要把B和C放在同一个列表中,因为我想根据它们的共享属性进行排序,我可以这样做。

只要要求保持列表中混合类型的排序即可 B, C 两者都延伸 A 来调用它们的非继承方法,你别无选择,只能使用 List<A> 包含所有类型。

虽然我也尽量避免降频,但这并不意味着在某些情况下它既无用也无必要。

for (A item: sortedList) {
    if (item instanceof B) {
        Whatever fieldB = ((B) item).getFieldB();  // using non-inherited method of B
    } else if (item instanceof C) {
         Whatever fieldC = ((C) item).getFieldC();  // using non-inherited method of C
    } else {
         // either only A or anything different that extends A
    }
}

从Java 14开始,由于 JEP 305: Pattern Matching for instanceof(模式匹配),这样的事物就会变得不那么啰嗦。

for (A item: sortedList) {
    if (item instanceof B b) {
        Whatever fieldB = b.getFieldB();  // using non-inherited method of B
    } else if (item instanceof C c) {
        Whatever fieldC = c.getFieldC();  // using non-inherited method of C
    } else {
        // either only A or anything different that extends A
    }
}

给TA打赏
共{{data.count}}人
人已打赏
未分类

我可以简化这些JavaScript三元运算符吗?`variableA ? variableB : false`改为`variableA && variableB`。

2022-9-8 23:17:41

未分类

春天数据Neo4j APOC不执行但不出错

2022-9-8 23:28:37

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索