Introdução
Acho que todo mundo já ouviu o ditado "Meça duas vezes, corte uma vez". É um verdadeiro conselho em programação. É sempre melhor pensar sobre a implementação antes de gastar algum tempo realizando-a. Durante a implementação, muitas vezes você precisa criar classes e pensar em como elas irão interagir. Uma representação visual de tudo isso geralmente pode ajudá-lo a encontrar a solução mais correta. É aqui que o diagrama de classes UML vem em nosso auxílio.O que é UML?
Se você observar as imagens relevantes nos mecanismos de pesquisa, verá que a UML tem algo a ver com diagramas, setas e quadrados. Você precisa saber que UML significa Unified Modeling Language. Unificado é a palavra importante aqui. Isso significa que nossas imagens serão compreendidas não apenas por nós, mas também por qualquer outra pessoa que conheça UML. É a língua franca para desenhar diagramas.De acordo com a Wikipédia,
"UML é uma linguagem de modelagem de propósito geral e desenvolvimento no campo da engenharia de software que se destina a fornecer uma maneira padrão de visualizar o design de um sistema."O mais interessante, que nem todos imaginariam, é que a UML tem especificações. E há até uma especificação UML 2. Mais informações sobre a especificação estão disponíveis no site do Object Management Group . Na verdade, esse grupo desenvolve as especificações UML. Também é interessante que a UML não se limita a descrever a estrutura das classes. Existem muitos tipos de diagramas UML. A Wikipedia tem uma breve descrição de vários tipos de diagramas UML: Diagramas UML . Voltando aos diagramas de classe UML, vale mencionar o livro "Head First Design Patterns" , que usa diagramas UML para ilustrar padrões de projeto. O ponto principal é que a UML é realmente usada. E acontece que conhecê-lo e entender como usar são bastante úteis.
Aplicativo
Vamos descobrir se podemos trabalhar com UML em um IDE. Usaremos o IntelliJ IDEA como nosso IDE. Se você estiver usando o IntelliJ IDEA Ultimate, teremos o plug-in "UML Support" instalado "pronto para uso". Ele permite gerar automaticamente belos diagramas de classe. Por exemplo, use Ctrl+N ou o item de menu "Navegar" -> "Classe" para ir para a classe ArrayList. Agora, no menu de contexto do nome da classe, selecione "Diagrama" -> "Mostrar pop-up do diagrama". Como resultado, obtemos um belo diagrama.

@startuml
class ArrayList {
}
class LinkedList {
}
@enduml
Para ver o resultado no IDEA, selecione "View" -> "Tool Windows" -> "PlantUML". Acabamos de obter dois quadrados que representam classes. Sabemos que ambas as classes implementam a interface List . Essa relação de classe é chamada de realização. Essa relação é representada por uma seta com uma linha pontilhada. Vamos desenhá-lo:
interface List
List <|.. ArrayList
List <|.. LinkedList
List é um dos filhos da classe Collection . Ou seja, herda Collection . Essa relação é chamada de generalização. Parece uma flecha com uma linha contínua comum. Vamos desenhá-lo:
interface Collection
Collection <|-- List
Para o próximo tipo de relacionamento, adicione à descrição da classe ArrayList uma entrada sobre um array privado de elementos do pacote :
~Object[] elementData
Agora queremos mostrar que ArrayList contém alguns objetos. Nesse caso, haverá um relacionamento de agregação. ArrayListé um agregado, pois contém outros objetos. Dizemos agregação porque os objetos da lista podem existir sem a lista: eles não são partes integrantes da lista. O tempo de vida deles não está vinculado ao tempo de vida da lista. A palavra "agregado" vem do latim e se traduz como "montado", ou seja, algo feito de algo. Por exemplo, na vida, temos um conjunto de bomba (agregado), que consiste em uma bomba e um motor. A própria montagem pode ser desmontada e podemos deixar alguns de seus componentes sozinhos. Por exemplo, para vender ou colocar em outra montagem. É da mesma forma em uma lista. Isso é expresso com um losango vazio no agregado e uma linha contínua. Vamos representar isso da seguinte forma:
class Object{
}
ArrayList o- Object
Agora queremos mostrar que, ao contrário de ArrayList , a classe LinkedList contém Node s — contêineres que fazem referência aos dados armazenados. Neste caso, os Node s fazem parte de LinkedList e não possuem uma existência independente. Um Node não é o conteúdo em si. Contém apenas uma referência ao conteúdo. Por exemplo, quando adicionamos uma string a uma LinkedList , estamos adicionando um novo Node que contém uma referência à string, bem como um link para o Node anterior e o seguinte. Essa relação é chamada de composição. É representado desenhando uma linha contínua com um losango preenchido no composto (algo feito de partes constituintes). Agora representaremos o relacionamento como texto:
class Node{
}
LinkedList *-- Node
E agora você precisa aprender a retratar outro tipo importante de relacionamento: a dependência. É usado quando uma classe usa outra, mas a classe não contém nem herda a classe usada. Por exemplo, LinkedList e ArrayList sabem como criar um ListIterator . Representamos isso como setas com uma linha pontilhada:
class ListIterator
ListIterator <... ArrayList : create
ListIterator <... LinkedList : create
Depois de fazer tudo isso, obtemos: 
Automação
Existem várias maneiras de gerar diagramas PlantUML automaticamente. Por exemplo, IDEA tem o plug-in SketchIT , mas não desenha diagramas totalmente corretamente. Digamos que a implementação das interfaces seja desenhada incorretamente (é exibida como herança). A Internet tem exemplos de como integrar isso no processo de construção do seu projeto. Por exemplo, você pode descobrir como usar uml-java-docklet com Maven. Para demonstrar, usaremos o Maven Archetype para criar rapidamente um projeto Maven. Correr
mvn archetype:generate
Em resposta a Escolha um número ou aplique filtro, deixe o padrão — basta pressionar Enter. Sempre será "maven-archetype-quickstart". Selecione a versão mais recente. A seguir, responderemos algumas perguntas e finalizaremos a criação do projeto: 
mvn clean install
e
mvn javadoc: javadoc
Se abrirmos agora a documentação gerada (explorer target\site\apidocs\index.html), veremos os diagramas UML. A propósito, o relacionamento de implementação agora é exibido corretamente :)
GO TO FULL VERSION