Java Reference
In-Depth Information
Sidebar 5.1 Aggregate association
Aggregation can be implemented as a normal one-to-one association, using
attributes of the container that represent the links to the components. The seman-
tics of aggregation require the lifetime of the components to be bound by the life-
time of the container; when the container is created the components are also
created. There are two main solutions:
■
initialization in the constructor; and
■
inline initialization.
The first solution can be written as follows:
bus
#
new
Bus();
This technique has a couple of drawbacks. First, it is error prone: it is easy to
forget to write the creation instructions, resulting in uninitialized attributes.
Second, it is not readable: when looking at the attributes it is impossible to under-
stand that they represent aggregation without looking at the constructor too. The
second alternative, the inline initialization can be implemented as follows:
public
Bus bus
#
new
Bus();
This approach overcomes the drawbacks of the previous one. It is less error
prone: it is difficult to forget to create the objects because they are created in the
same place as where they are defined. It is more readable: the final keyword
together with the inline initialization clearly states that these objects are created
once and their lifetime is linked to the lifetime of the compound object.
public final
Bus bus
#
new
Bus();
With the above declaration the
bus
attribute will refer to the same object for all
its lifetime.
The bus is made up of three attributes holding persistently the infor-
mation that components communicate to each other. These attributes are
accessible through getter and setter methods.
public class
Bus {
private
String data; // the data bus
private
String command; // the command bus
private
int address; // the address bus
// getter and setter for data bus
public void
setData(String data) {
this
.data
#
data; }
public
String getData() { return data; }
// getter and setter for command bus
public void
setCommand(String command)
{
this
.command
#
command; }
public
String getCommand() {
return
command; }
// getter and setter for address bus
public void
setAddress(
int
address)
{
this
.address
#
address; }
public int
getAddress() {
return
address; }
}