So when, in this topic, I talk about the good parts of Java, I'm going to be talking about the
parts that aid in writing programs (or parts of programs) in environments in which Java it-
self is the appropriate choice of programming language and environment. I'm assuming that
you are using Java for a large, multiperson project that is producing long-lived programs or
components that need to be highly reliable, and that those programs or components will be
used and modified by even more people. This is not all of programming, and for other kinds
of programming activities in other kinds of environments, what I will be talking about might
not make Java a good language, and in fact Java itself might be the wrong tool for the job.
For clarity of exposition, in what follows, I will talk about things that are good parts of Java.
When I do, you should understand that I mean “good part of Java, for doing the things that
Java is good for doing.”
When I first started using Java, one of the real attractions of the language and the environment
was the simplicity of it all. There was a language that generated bytecodes that would run on
any Java virtual machine, no matter what the underlying operating system. There were a small
number of libraries that provided basic functionality, all written by the same small group of
engineers and all sharing a similar design philosophy. If you knew C or C++, Java was easy
to learn. Although some libraries may have been better than others, they were all reasonable.
Since then, Java and the associated environment have grown tremendously, both in popularity
and in size. Java started out as a language for writing web applications that would run in a
browser, and is now a language that is used for core system programming in the enterprise.
The language itself has seen a number of major and minor additions, ranging from generic
types (major) to autoboxing (minor). The platform has grown from a single entity to multiple
editions, from Java Enterprise Edition and Standard Edition to all of the small Java environ-
ments for phones and smart cards. The set of libraries has grown at an even faster rate.
The end result is an overall system that has grown in complexity and can be daunting to those
trying to master it. But within this large and complex system, there is still the small and simple
core system, if you just know where to find it. The goal of this topic is to show that small,
simple system that every Java programmer who is using Java for what the language and en-
vironment are good for should know. This is not meant as a tutorial in the language; there are
many of those, so I'm going to assume that you are familiar with Java and can read the ex-
amples without a lot of explanation. Nor is this an attempt to show you the clever tricks and
techniques that will allow you go get the most out of your Java program—others have done
that job far better than I can do it.
Instead, this is a reminder of which parts of the language are useful in all situations, and at
times, a reflection on why particular design choices were made or not made. My hope is that
you will come away from this topic with a reinforced view of the use of certain parts of the