UML ClassDiagram Java Book
UML ClassDiagram Java Book
UML class diagrams allow us to denote the static contents of and the relationships between classes.
This reading is adapted from Robert Martins book.
UML class diagrams allow us to denote the static contents of and the relationships between classes.
In a class diagram we can show the member variables, and member functions of a class. We can also show
whether one class inherits from another, or whether it holds a reference to another. In short, we can depict
all the source code dependencies between classes.
This can be valuable. It can be much easier to evaluate the dependency structure of a system from a
diagram than from source code. Diagrams make certain dependency structures visible. We can see
dependency cycles, and determine how best to break them. We can see when abstract classes depend
upon concrete classes, and determine a strategy for rerouting such dependencies.
The Basics
Classes
Above shows an elementary form of class diagram. The class named Dialer is represented as a rectangle.
This diagram represents nothing more than the code shown to its right.
This is the most common way you will represent a class. The classes on most diagrams don't need any
more than their name to make clear what is going on.
A class icon can be subdivided into compartments. The top compartment is for the name of the class, the
second is for the variables of the class, and the third is for the methods of the class. This example shows
these compartments and how they translate into code.
Above we saw that 15 Button objects were connected to the Phone object. In the next example below, we
see what happens when there is no limit. A Phonebook is connected to many PhoneNumber objects. The
star means many. In Java this is most commonly implemented with a Vector, a List, or some other
container type.
Noticed we avoid using the word has. We could have said: A Phonebook has many PhoneNumbers.
This was intentional. The common OO verbs HASA and ISA have special meanings. Some people
engage in hasa and isa analyses that identify what properties an object has (tom has a cat) and what
an object is (the cat is a kind of animal). Consequently, we try to find more precise verbs to describe the
action: terms that are descriptive of what actually happens in software, such as: is connected to.
Inheritance
There are many kinds of arrows used in UML - be aware!
Below is another way to convey the same idea. Interfaces can be drawn as little lollipops on the classes
that implement them. We often see this kind of notation in COM (Communications) designs.
Note that this all is kinda sloppy cause we have not been particularly thorough in documenting the
methods of the various UI interfaces. Certainly WithdrawalUI will need more than just the two methods
shown there. What about promptForAccount or informCashDispenserEmpty? Putting those methods in
the diagram would just clutter it. By providing a representative batch of methods, I've given the reader
the idea. That's all that's really necessary. [UML designers often drop what seems unnecessary in favor of
simplicity of design (tho some designs can be awfully complicated!).
I draw interfaces so often that spelling the whole stereotype out at the white board can be pretty
inconvenient. So I often use the shorthand in the lower part of Figure 3-9 to make the drawing easier. It's
not standard UML, but it's much more convenient.
utility
All the methods and variables of a utility class are static. [Earlier authors call these class utilities.}
You can make your own stereotypes if you like. Some people often use stereotypes like persistent, CAPI, struct, or function. You just have to make sure that the people who are reading your diagrams
know what your stereotype means.
Abstract classes
In UML there are two ways to denote that a class or a method is abstract. You can write the name in
italics, or you can use the {abstract} property. Both options are shown below:
Other than the {abstract} property, , the class properties activity is pretty rare.
Aggregation
Aggregation is a special form of association that connotes a whole/part relationship. Below image
shows how it is drawn and implemented. Notice that the implementation shown here is indistinguishable
from association. Thats a hint.
Unfortunately, UML does not provide a strong definition for this relationship. This leads to confusion
because various programmers and analysts adopt their own pet definitions for the relationship. For that
The same rule applies to composition that applied to aggregation. There can be no cycles of instances. An
owner cannot be its own ward. However, UML provides quite a bit more definition.
An instance of a ward cannot be owned simultaneously by two owners. The object diagram
below is illegal. Note, however, that the corresponding class diagram is not illegal. An owner can transfer
ownership of a ward to another owner.
Multiplicity
Objects can hold arrays or vectors of other objects, or they can hold many of the same kind of objects in
separate instance variables. In UML this can be shown by placing a multiplicity expression on the far end
* or 0..*
Zero to many.
0..1
1..*
One to many.
3..5
Three to five.
0, 2..5, 9..*
Association stereotypes
Associations can be labeled with stereotypes that change their meaning. Figure 3-20 shows the ones that I
use most often.
The create stereotype indicates that the target of the association is created by the source. The
implication is that the source creates the target and then passes it around to other parts of the system. In
the example I've shown a typical factory.
The local stereotype is used when the source class creates an instance of the target and holds it in a
local variable. The implication is that the created instance does not survive the member function that
creates it. Thus, it is not held by any instance variable nor passed around the system in any way.
The parameter stereotype shows that the source class gains access to the target instance though the
parameter of one of its member functions. Again, the implication is that the source forgets all about this
object once the member function returns. The target is not saved in an instance variable.
Using dashed dependency arrows, as the diagram shows, is a common and convenient idiom for
denoting parameters. I usually prefer it to using the parameter stereotype.
The delegate stereotype is used when the source class forwards a member function invocation to the
target. There are a number of design patterns where this technique is applied, such as PROXY,
DECORATOR, and COMPOSITE . You might find this notation useful - or not - notice that your analyses
will tend to follow the same paths of thought.
Inner classes
Inner (nested) classes are represented in UML with an association adorned with a crossed circle, as shown
in Figure 3-21.
Association classes
Associations with multiplicity tell us that the source is connected to many instances of the target, but the
diagram doesnt tell us what kind of container class is used. This can be depicted by using an association
class:
Association classes show how a particular association is implemented. On the diagram they appear as a
normal class connected to the association with a dashed line. As Java programmers we interpret this to
mean that the source class really contains a reference to the association class, which in turn contains
references to the target.
Association classes can also be used to indicate special forms of references, such as weak, soft, or
phantom references. The first figure below is the weak relationship.
Association qualifiers
Association qualifiers are used when the association is implemented through some kind of key or token,
instead of with a normal Java reference. The next figure shows a LoginServlet associated with an
Employee. The association is mediated by a member variable named empid, which contains the
database key for the Employee.
I find this notation useful in rare situations. Sometimes it's convenient to show that an object is associated
to another through a database or dictionary key. It is important, however, that all the parties reading the
diagram know how the qualifier is used to access the actual object. This is not something that's
immediately evident from the notation.
Conclusion