Java Reference
In-Depth Information
Singleton (Chapter 8)
SOLUTION 8.1
To prevent other developers from instantiating your class, create a single constructor with
private visibility. Note that if you create other, nonprivate constructors or create no
constructors at all, other developers will likely be able to reinstantiate your class.
SOLUTION 8.2
As
Design Patterns
says, "You might not have enough information to instantiate every
singleton at static initialization time. A singleton might require values that are computed later
in the program's execution" (p. 130). When a
Factory
singleton is born, for example, it
might have to establish connections with machine drivers, to set up planners, and to initialize
a simulation of itself.
SOLUTION 8.3
Your solution should eliminate the possibility of confusion that can occur when two threads
call the
recordWipMove()
method at approximately the same time:
public void recordWipMove()
{
synchronized (classLock)
{
wipMoves++;
}
}
Is it possible that a thread might activate in the middle of an increment operation? Even if
you're certain that the answer is no, it's a good policy to carefully restrict access to
a singleton's data in a multithreaded application.
Multithreaded applications often fail because their developers do not understand
the mechanics of synchronization or do not foresee subtle problems that can occur. If you are
working with a multithreaded Java application, I heartily recommend familiarizing yourself
with the information in
Concurrent Programming in Java™
(Lea 2000).
SOLUTION 8.4
OurBiggestRocket
This class has an inappropriate name. You should model attributes,
such as "biggest," with attributes, not with class names. If a developer
must
sustain this class, perhaps it is a singleton.
TopSalesAssociate
This class has the same problem as
OurBiggestRocket
.
Math
This class is a
utility,
with all static methods and
no
instances. It is not
a singleton.
System
This is a utility.
PrintStream
Although the
System.out
object is a
PrintStream
object with
unique responsibilities, it is not a unique instance of
PrintStream
,
which is not a singleton class.