Invoking
Overloaded Constructors Through this( )
When working with overloaded
constructors, it is sometimes useful for one constructor to invoke another. In
Java, this is accomplished by using another form of the this keyword. The general form is shown here:
this(arg-list)
When this( ) is executed, the overloaded constructor that matches the
parameter list specified by arg-list
is executed first. Then, if there are any statements inside the original
constructor, they are executed. The call to this( ) must be the first statement within
the constructor.
To understand how this( ) can be used, let’s work through
a short example. First, consider the following class that does not use this( ):
class MyClass { int a;
int b;
//initialize a and b individually
MyClass(int i, int j) {
a = i; b = j;
}
//initialize a and b to the same value
MyClass(int i) {
a = i; b = i;
}
//give a and b default values of 0
MyClass( ) {
a = 0; b = 0;
}
}
This class contains three
constructors, each of which initializes the values of a and b. The first is
passed individual values for a and b. The second is passed just one value,
which is assigned to both a and b. The third gives a and b default values
of zero.
By using this( ), it is possible to rewrite MyClass as shown here:
class MyClass { int a;
int b;
//initialize a and b individually
MyClass(int i, int j) {
a = i; b = j;
}
//initialize a and b to the same value
MyClass(int i) {
this(i, i); // invokes
MyClass(i, i)
}
//give a and b default values of 0
MyClass( ) {
this(0); // invokes MyClass(0)
}
}
In this version of MyClass, the only constructor that
actually assigns values to the a and
b fields is MyClass(int, int). The other two constructors simply invoke that
constructor (either directly or
indirectly) through this( ). For
example, consider what happens when this statement executes:
MyClass mc = new MyClass(8);
The call to MyClass(8) causes this(8, 8) to be executed, which translates into a call to MyClass(8, 8), because this is the
version of the MyClass constructor
whose parameter list matches the
arguments passed via this( ). Now,
consider the following statement, which uses the default constructor:
MyClass mc2 = new MyClass();
In this case, this(0) is called. This causes MyClass(0) to be invoked because it is
the constructor with the matching parameter list. Of course, MyClass(0) then calls MyClass(0,0) as just described.
One reason why invoking
overloaded constructors through this( )
can be useful is that it can prevent the unnecessary duplication of code. In
many cases, reducing duplicate code decreases the time it takes to load your
class because often the object code is smaller. This is especially important
for programs delivered via the Internet in which load times are an issue. Using
this( ) can also help structure your
code when constructors contain a large amount of duplicate code.
However, you need to be
careful. Constructors that call this( )
will execute a bit slower than those that contain all of their initialization
code inline. This is because the call and return mechanism used when the second
constructor is invoked adds overhead. If your class will be used to create only
a handful of objects, or if the constructors in the class that call this( ) will be seldom used, then this
decrease in run-time performance is probably insignificant. However, if your
class will be used to create a large number of objects (on the order of
thousands) during program execution, then the negative impact of the increased
overhead could be meaningful. Because object creation affects all users of your
class, there will be cases in which you must carefully weigh the benefits of
faster load time against the increased time it takes to create an object.
Here is another consideration:
for very short constructors, such as those used by MyClass, there is often little difference in the size of the object
code whether this( ) is used or not.
(Actually, there are cases in which no reduction in the size of the object code
is achieved.) This is because the bytecode that sets up and returns from the
call to this( ) adds instructions to
the object file. Therefore, in these types of situations, even though duplicate
code is eliminated, using this( )
will not obtain significant savings in terms of load time. However, the added
cost in terms of overhead to each object’s construction will still be incurred.
Therefore, this( ) is most
applicable to constructors that contain large amounts of initialization code,
not those that simply set the value
of a handful of fields.
There are two restrictions
you need to keep in mind when using this(
). First, you cannot use any instance variable of the constructor’s class
in a call to this( ). Second, you
cannot use super( ) and this( ) in the same constructor because
each must be the first statement in the constructor.
Related Topics
Privacy Policy, Terms and Conditions, DMCA Policy and Compliant
Copyright © 2018-2023 BrainKart.com; All Rights Reserved. Developed by Therithal info, Chennai.