The
Evolution of Java
The initial release of Java
was nothing short of revolutionary, but it did not mark the end of Java’s era
of rapid innovation. Unlike most other software systems that usually settle
into a pattern of small, incremental improvements, Java continued to evolve at
an explosive pace. Soon after the release of Java 1.0, the designers of Java
had already created Java 1.1. The features added by Java 1.1 were more significant
and substantial than the increase in the minor revision number would have you
think. Java 1.1 added many new library elements, redefined the way events are
handled, and reconfigured many features of the 1.0 library. It also deprecated
(rendered obsolete) several features originally defined by Java 1.0. Thus, Java
1.1 both added to and subtracted from attributes of its original specification.
The next major release of
Java was Java 2, where the “2” indicates “second generation.” The creation of
Java 2 was a watershed event, marking the beginning of Java’s “modern age.” The
first release of Java 2 carried the version number 1.2. It may seem odd that
the first release of Java 2 used the 1.2 version number. The reason is that it
originally referred to the internal version number of the Java libraries, but
then was generalized to refer to the entire release. With Java 2, Sun
repackaged the Java product as J2SE (Java 2 Platform Standard Edition), and the
version numbers began to be applied to that product.
Java 2 added support for a
number of new features, such as Swing and the Collections Framework, and it
enhanced the Java Virtual Machine and various programming tools. Java 2 also
contained a few deprecations. The most important affected the Thread class in which the methods suspend( ), resume( ), and stop( )
were deprecated.
J2SE 1.3 was the first major
upgrade to the original Java 2 release. For the most part, it added to existing
functionality and “tightened up” the development environment. In general, programs
written for version 1.2 and those written for version 1.3 are source-code
compatible. Although version 1.3 contained a smaller set of changes than the
preceding three major releases, it was nevertheless important.
The release of J2SE 1.4
further enhanced Java. This release contained several important upgrades,
enhancements, and additions. For example, it added the new keyword assert, chained exceptions, and a
channel-based I/O subsystem. It also made changes to the Collections Framework
and the networking classes. In addition, numerous small changes were made
throughout. Despite the significant number of new features, version 1.4
maintained nearly 100 percent source-code compatibility with prior versions.
The next release of Java was
J2SE 5, and it was revolutionary. Unlike most of the previous Java upgrades,
which offered important, but measured improvements, J2SE 5 fundamentally
expanded the scope, power, and range of the language. To grasp the magnitude of
the changes that J2SE 5 made to Java, consider the following list of its major
new features:
Generics
Annotations
Autoboxing and auto-unboxing
Enumerations
Enhanced, for-each style for loop
Variable-length arguments
(varargs)
Static import
Formatted I/O
Concurrency utilities
This is not a list of minor
tweaks or incremental upgrades. Each item in the list represented a significant
addition to the Java language. Some, such as generics, the enhanced for, and varargs, introduced new syntax
elements. Others, such as autoboxing and auto-unboxing, altered the semantics
of the language. Annotations added an entirely new dimension to programming. In
all cases, the impact of these additions went beyond their direct effects. They
changed the very character of Java itself.
The importance of these new
features is reflected in the use of the version number “5.” The next version
number for Java would normally have been 1.5. However, the new features were so
significant that a shift from 1.4 to 1.5 just didn’t seem to express the
magnitude of the change. Instead, Sun elected to increase the version number to
5 as a way of emphasizing that a major event was taking place. Thus, it was
named J2SE 5, and the developer’s kit was called JDK 5. However, in order to
maintain consistency, Sun decided to use 1.5 as its internal version number,
which is also referred to as the developer
version number. The
“5” in J2SE 5 is called the product version number.
The next release of Java was
called Java SE 6. Sun once again decided to change the name of the Java
platform. First, notice that the “2” was dropped. Thus, the platform was now
named Java SE, and the official
product name was Java Platform, Standard
Edition 6.
The Java Development Kit was
called JDK 6. As with J2SE 5, the 6 in Java SE 6 is the product version number.
The internal, developer version number is 1.6.
Java SE 6 built on the base
of J2SE 5, adding incremental improvements. Java SE 6 added no major features
to the Java language proper, but it did enhance the API libraries, added
several new packages, and offered improvements to the runtime. It also went
through several updates during its (in Java terms) long life cycle, with
several upgrades added along the way. In general, Java SE 6 served to further
solidify the advances made by J2SE 5.
Java SE 7 was the next
release of Java, with the Java Development Kit being called JDK 7, and an
internal version number of 1.7. Java SE 7 was the first major release of Java
since Sun Microsystems was acquired by Oracle. Java SE 7 contained many new
features, including significant additions to the language and the API
libraries. Upgrades to the Java run-time system that support non-Java languages
were also included, but it is the language and library additions that were of
most interest to Java programmers.
The new language features
were developed as part of Project Coin.
The purpose of Project Coin was to identify a number of small changes to the
Java language that would be incorporated into JDK 7. Although these features
were collectively referred to as “small,” the effects of these changes have
been quite large in terms of the code they impact. In fact, for many
programmers, these changes may well have been the most important new features
in Java SE 7. Here is a list of the language features added by JDK 7:
• A String can now control a switch statement. Part
• Binary integer literals.
• Underscores in numeric literals.
• An expanded try statement, called
try-with-resources, that supports automatic resource management. (For example,
streams can be closed automatically when they are no longer needed.)
• Type inference (via the diamond operator)
when constructing a generic instance.
• Enhanced exception handling in which two or
more exceptions can be caught by a single catch (multi-catch) and better type
checking for exceptions that are rethrown.
• Although not a syntax change, the compiler
warnings associated with some types of varargs methods were improved, and you
have more control over the warnings.
As you can see, even though
the Project Coin features were considered small changes to the language, their
benefits were much larger than the qualifier “small” would suggest. In
particular, the try-with-resources statement has profoundly affected the way
that stream-based code is written. Also, the ability to use a String to control
a switch statement was a long desired improvement that simplified coding in
many situations.
Java SE 7 made several
additions to the Java API library. Two of the most important were the
enhancements to the NIO Framework and the addition of the Fork/Join Framework.
NIO (which originally stood for New I/O) was added to Java in version 1.4.
However, the changes added by Java SE 7
fundamentally expanded its capabilities. So significant were the changes, that
the term NIO.2 is often used.
The Fork/Join Framework
provides important support for parallel programming. Parallel programming is
the name commonly given to the techniques that make effective use of computers
that contain more than one processor, including multicore systems. The
advantage that multicore environments offer is the prospect of significantly
increased program performance. The Fork/Join Framework addressed parallel
programming by
• Simplifying the creation and use of tasks
that can execute concurrently
• Automatically making use of multiple
processors
Therefore, by using the
Fork/Join Framework, you can easily create scaleable applications that
automatically take advantage of the processors available in the execution
environment. Of course, not all algorithms lend themselves to parallelization,
but for those that do, a significant improvement in execution speed can be
obtained.
Related Topics
Privacy Policy, Terms and Conditions, DMCA Policy and Compliant
Copyright © 2018-2023 BrainKart.com; All Rights Reserved. Developed by Therithal info, Chennai.