Chapter 20. Don’t Vary Your Variables
Steve Freeman
I try to make as many variables as possible final because I find it easier to reason about immutable code. It makes my coding life simpler, which is a high priority for me—I’ve spent too much time trying to figure out exactly how the contents of a variable change throughout a block of code. Of course, Java’s support for immutability is more limited than some other languages, but there are still things we can do.
Assign Once
Here’s a small example of a structure I see everywhere:
Thing thing;
if (nextToken == MakeIt) {
thing = makeTheThing();
} else {
thing = new SpecialThing(dependencies);
}
thing.doSomethingUseful();
To me this doesn’t irrevocably express that we’re going to set the value of thing before we use it and not change it again. It takes me time to walk through the code and figure out that it won’t be null. It’s also an accident waiting to happen when we need to add more conditions and don’t quite get the logic right. Modern IDEs will warn about an unset thing—but then lots of programmers ignore warnings. A first fix would be to use a conditional expression:
final var thing = nextToken == MakeIt
? makeTheThing()
: new SpecialThing(dependencies);
thing.doSomething();
The only way through this code is to assign thing a value.
A next step is to wrap up this behavior in a function to which I can give a descriptive name: ...