Java 中 List 的继承体系

本贴最后更新于 2310 天前,其中的信息可能已经水流花落
@startuml interface Iterable interface Collection interface List abstract class AbstractCollection abstract class AbstractList class ArrayList abstract class AbstractSequentialList class LinkedList interface Deque interface Queue class Vector Collection -up-|> Iterable List -up-|> Collection AbstractCollection .up.|> Collection AbstractList .up.|> List AbstractList -up-|> AbstractCollection ArrayList .up.|> List ArrayList -up-|> AbstractList AbstractSequentialList -up-|> AbstractList LinkedList .up.|> List LinkedList .up.|> Deque LinkedList -up-|> AbstractSequentialList Deque -up-|> Queue Vector .up.|> List Vector -up-|> AbstractList Stack -up-|> Vector @enduml

分析其中的设计原则

单一职责-SRP

首先考虑以下几个问题

需要符合单一职责的事物有哪些?

  1. 接口
  2. 方法
  3. 模块或者服务

职责划分的依据

参考 概念的划分

AbstractList 按照是否线程安全和是否内存连续划分为 Vector、ArrayList 和 AbstractSequentialList

  1. 线程安全,内存连续 -Vector
  2. 线程不安全,内存连续- ArrayList
  3. 内存不连续,线程或者安全或者不安全 -AbstractSequentialList

AbstractSequentialList 根据线程是否安全划分

  1. 线程不安全 -linkedlist

目前没看到线程安全的 linkedlist 结构。

这种划分给我的感觉,像没有符合连续划分的规范,比如正常是把“教材”分成“自然科学教材、社会科学教材”;再把“自然科学教材”进一步分为“数学教材、物理学教材、化学教材、生物学教材等”

这里是是把“教材”分成“数学教材、物理学教材、“有机化学教材、无机化学教材、生物学教材、社会科学教材”等。

如果忽略抽象父类,划分中各子项的外延之和必须等于母项的外延这一规则也没有符合,可能从实际来讲线程安全的链表没啥用处?

如果让我设计,我可能会按照习惯这样

@startuml abstract class AbstractList class ArrayList abstract class AbstractSequentialList abstract class AbstractArray class LinkedList class Vector ArrayList -up-|> AbstractArray AbstractArray -up-|> AbstractList AbstractSequentialList -up-|> AbstractList LinkedList -up-|> AbstractSequentialList Vector -up-|> AbstractArray @enduml

当然,具体划分依据按照项目需求来,不需求划分的太细,但要考虑到项目需求可能产生的变更 。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3196 引用 • 8215 回帖
  • up-
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...