[Java] 一些类图

89 阅读1分钟

一些类图

Stream

Stream.of(...) 得到的是 ReferencePipeline.Head 类的实例,ReferencePipeline.Head 类的基类是 ReferencePipeline。以下两个类也是 ReferencePipeline 的子类

  • ReferencePipeline.StatefulOp
  • ReferencePipeline.StatelessOp

简要的类图如下(图中忽略了所有的泛型,且大部分字段/方法都没有画)⬇️

classDiagram
class AutoCloseable
class BaseStream
class Stream
class PipelineHelper
class `ReferencePipeline.Head`
class ReferencePipeline
class AbstractPipeline
class `ReferencePipeline.StatefulOp`
class `ReferencePipeline.StatelessOp`

<<interface>> AutoCloseable
<<interface>> BaseStream
<<interface>> Stream
<<Abstract>> PipelineHelper
<<Abstract>> ReferencePipeline
<<Abstract>> AbstractPipeline

AutoCloseable <|-- BaseStream
BaseStream <|-- Stream
Stream <|.. ReferencePipeline
PipelineHelper <|-- AbstractPipeline
AbstractPipeline <|-- ReferencePipeline
ReferencePipeline <|-- `ReferencePipeline.Head`
ReferencePipeline <|-- `ReferencePipeline.StatefulOp`
ReferencePipeline <|-- `ReferencePipeline.StatelessOp`

AbstractPipeline: - final AbstractPipeline sourceStage
AbstractPipeline: # final AbstractPipeline previousStage
AbstractPipeline: - AbstractPipeline nextStage
AbstractPipeline: - int depth

我把上图中出现的类名/接口名与 Fully Qualified Name 之间的对应关系列在下表里了 ⬇️

在上图中的类名/接口名Fully Qualified Name
AutoCloseablejava.lang.AutoCloseable
BaseStreamjava.util.stream.BaseStream
Streamjava.util.stream.Stream
PipelineHelperjava.util.stream.PipelineHelper
AbstractPipelinejava.util.stream.AbstractPipeline
ReferencePipelinejava.util.stream.ReferencePipeline
ReferencePipeline.Headjava.util.stream.ReferencePipeline.Head
ReferencePipeline.StatefulOpjava.util.stream.ReferencePipeline.StatefulOp
ReferencePipeline.StatelessOpjava.util.stream.ReferencePipeline.StatelessOp

利用 AbstractPipeline 类中的 previousStage/nextStage 字段,可以把 ReferencePipeline 的实例组织成双向链表的形式。

用代码验证

请将如下代码保存为 Main.java ⬇️

import java.util.function.Function;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        System.out.println(Stream.of().getClass().getName());
        System.out.println(Stream.of().map(Function.identity()).getClass().getSuperclass().getName());
        System.out.println(Stream.of().sorted().getClass().getSuperclass().getName());
    }
}

用以下命令可以编译 Main.java 并运行其中的 main 方法 ⬇️

javac Main.java
java Main

运行结果如下 ⬇️

java.util.stream.ReferencePipeline$Head
java.util.stream.ReferencePipeline$StatelessOp
java.util.stream.ReferencePipeline$StatefulOp

可以把相关信息整理成如下的表格 ⬇️

生成的对象所属的类
Stream.of(...)ReferencePipeline.Head
Stream.of(...).map(...)ReferencePipeline.StatelessOp 的匿名子类
Stream.of(...).sorted()ReferencePipeline.StatefulOp 的子类

OutOfMemoryError/StackOverflowError/NullPointerException

classDiagram

Throwable <|-- Exception
RuntimeException <|-- IndexOutOfBoundsException
RuntimeException <|-- NullPointerException
Throwable <|-- Error
VirtualMachineError <|-- OutOfMemoryError
VirtualMachineError <|-- StackOverflowError
Exception <|-- RuntimeException
Error <|-- VirtualMachineError
RuntimeException <|-- IllegalStateException
RuntimeException <|-- IllegalArgumentException
RuntimeException <|-- UnsupportedOperationException
Serializable <|.. Throwable

<<Abstract>> VirtualMachineError
<<interface>> Serializable
在上图中的类名/接口名Fully Qualified Name
Errorjava.lang.Error
Exceptionjava.lang.Exception
IllegalArgumentExceptionjava.lang.IllegalArgumentException
IllegalStateExceptionjava.lang.IllegalStateException
IndexOutOfBoundsExceptionjava.lang.IndexOutOfBoundsException
NullPointerExceptionjava.lang.NullPointerException
OutOfMemoryErrorjava.lang.OutOfMemoryError
RuntimeExceptionjava.lang.RuntimeException
Serializablejava.io.Serializable
StackOverflowErrorjava.lang.StackOverflowError
Throwablejava.lang.Throwable
UnsupportedOperationExceptionjava.lang.UnsupportedOperationException
VirtualMachineErrorjava.lang.VirtualMachineError

ArrayList

所有泛型信息均已略去

classDiagram
Iterable <|-- Collection
Collection <|.. AbstractCollection
AbstractCollection <|-- AbstractList
AbstractList <|-- ArrayList

Collection <|-- SequencedCollection
SequencedCollection <|-- List
List <|.. AbstractList

List <|.. ArrayList
RandomAccess <|.. ArrayList
Cloneable <|.. ArrayList
Serializable <|.. ArrayList

<<interface>> Serializable
<<interface>> Cloneable
<<interface>> RandomAccess
<<interface>> SequencedCollection
<<interface>> List
<<interface>> Iterable
<<interface>> Collection
<<Abstract>> AbstractCollection
<<Abstract>> AbstractList
上图中使用的名称fully qualified name
Serializablejava.io.Serializable
Cloneablejava.lang.Cloneable
RandomAccessjava.util.RandomAccess
SequencedCollectionjava.util.SequencedCollection
Listjava.util.List
Iterablejava.lang.Iterable
Collectionjava.util.Collection
AbstractCollectionjava.util.AbstractCollection
AbstractListjava.util.AbstractList
ArrayListjava.util.ArrayList

LinkedList

所有泛型信息均已略去

classDiagram
Iterable <|-- Collection
Collection <|.. AbstractCollection

AbstractCollection <|-- AbstractList
AbstractList <|-- AbstractSequentialList
AbstractSequentialList <|-- LinkedList

Collection <|-- SequencedCollection
SequencedCollection <|-- List
List <|.. AbstractList

List <|.. LinkedList
SequencedCollection <|-- Deque
Collection <|-- Queue
Queue <|-- Deque
Deque <|.. LinkedList

Cloneable <|.. LinkedList
Serializable <|.. LinkedList

<<interface>> Serializable
<<interface>> Cloneable

<<interface>> Iterable
<<interface>> Collection

<<interface>> SequencedCollection
<<interface>> List

<<interface>> SequencedCollection

<<interface>> Queue
<<interface>> Deque

<<Abstract>> AbstractCollection
<<Abstract>> AbstractList
<<Abstract>> AbstractSequentialList
上图中使用的名称fully qualified name
Iterablejava.lang.Iterable
Collectionjava.util.Collection
AbstractCollectionjava.util.AbstractCollection
AbstractListjava.util.AbstractList
AbstractSequentialListjava.util.AbstractSequentialList
SequencedCollectionjava.util.SequencedCollection
Listjava.util.List
Queuejava.util.Queue
Dequejava.util.Deque
Cloneablejava.lang.Cloneable
Serializablejava.io.Serializable
LinkedListjava.util.LinkedList

HashMapLinkedHashMap

所有泛型信息均已略去

classDiagram

Map <|.. AbstractMap
AbstractMap <|-- HashMap
Map <|.. HashMap
Cloneable <|.. HashMap
Serializable <|.. HashMap
HashMap <|-- LinkedHashMap
Map <|-- SequencedMap
SequencedMap <|.. LinkedHashMap

<<interface>> Cloneable
<<interface>> Serializable
<<interface>> Map
<<Abstract>> AbstractMap
<<interface>> SequencedMap
上图中使用的名称fully qualified name
LinkedHashMapjava.util.LinkedHashMap
HashMapjava.util.HashMap
AbstractMapjava.util.AbstractMap
Mapjava.util.Map
Cloneablejava.lang.Cloneable
Serializablejava.io.Serializable
SequencedMapjava.util.SequencedMap

HashMap 里的 Node

所有泛型信息均已略去

classDiagram
`java.util.Map$Entry` <|.. `java.util.HashMap$Node`
`java.util.HashMap$Node` <|-- `java.util.LinkedHashMap$Entry`
`java.util.LinkedHashMap$Entry` <|-- `java.util.HashMap$TreeNode`
<<interface>> `java.util.Map$Entry`

StringBuilderStringBuffer

所有泛型信息均已略去

classDiagram

Appendable <|.. AbstractStringBuilder
CharSequence <|.. AbstractStringBuilder
AbstractStringBuilder <|-- StringBuilder
Appendable <|.. StringBuilder
Serializable <|.. StringBuilder
Comparable <|.. StringBuilder
CharSequence <|.. StringBuilder
AbstractStringBuilder <|-- StringBuffer
Appendable <|.. StringBuffer
Serializable <|.. StringBuffer
Comparable <|.. StringBuffer
CharSequence <|.. StringBuffer

<<Abstract>> AbstractStringBuilder
<<interface>> Appendable
<<interface>> CharSequence
<<interface>> Comparable
<<interface>> Serializable
在上图中的类名/接口名Fully Qualified Name
AbstractStringBuilderjava.lang.AbstractStringBuilder
Appendablejava.lang.Appendable
CharSequencejava.lang.CharSequence
Comparablejava.lang.Comparable
Serializablejava.io.Serializable
StringBufferjava.lang.StringBuffer
StringBuilderjava.lang.StringBuilder

java.lang.AbstractStringBuilder 是一个密封类(sealed class),它只有 java.lang.StringBuilderjava.lang.StringBuffer 这两个子类(这两个子类都是 final class