Java 中 List 的继承体系

本贴最后更新于 2197 天前,其中的信息可能已经水流花落
@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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖 • 1 关注
  • up-
    1 引用

相关帖子

欢迎来到这里!

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

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