While working on an Open Source project, I came across this piece of code:
public void clear() {
Object[] items = this.items;
for (int i = 0, n = size; i < n; i++)
items[i] = null;
size = 0;
}
I thought this was a great opportunity to share how it might be improved.
Notes:
- Size is a field declared in the class.
- For simplicity, I have replaced
T[]
withObject[]
in this article. This is a parameterized class in the source code.
1. Braces around the loop
Although Java will happily compile the code, braces should wrap the for loop:
public void clear() {
Object[] items = this.items;
for (int i = 0, n = size; i < n; i++) {
items[i] = null;
}
size = 0;
}
This clarifies that size = 0;
is not contained within the loop.
2. A redundant local variable
The class declares a field called items
, which is an Array of Objects. This method starts by assigning that Array to a local variable, also named items
, which is then used in the loop.
However, there is no reason that this field cannot be referenced from within the loop, therefore making the local variable redundant:
public void clear() {
//Object[] items = this.items;
for (int i = 0, n = size; i < n; i++)
this.items[i] = null;
size = 0;
}
3. Another redundant variable, within the loop
In this style of for
loop in Java, 3 things are defined in the parentheses - a variable or variables to be used within the loop (usually i
), a condition for determining if the loop should continue, and finally how the loop should progress.
In this particular code, a local variable n
is declared and assigned to the size
field. This is then used in the end condition - the loop shall only execute while i
is less than n
.
Cutting out the middle man, this is effectively saying that the loop shall only execute while i
is less than size
, and so, we can simplify the code:
public void clear() {
Object[] items = this.items;
for (int i = 0; i < size; i++)
items[i] = null;
size = 0;
}
Bringing the changes together
To recap, we started with this block of code:
public void clear() {
Object[] items = this.items;
for (int i = 0, n = size; i < n; i++)
items[i] = null;
size = 0;
}
After our changes, this is simplified and clarified to:
public void clear() {
for (int i = 0; i < size; i++) {
items[i] = null;
}
size = 0;
}
Top comments (0)