ANSWER TO OWN QUESTION: I thought it would be useful to answer my own question as I have learnt a lot from the answers. This answer is intended to help those - like me - who do not have a complete understanding of the issues. If I use incorrect language please correct me.
true
and false
. It is the absence of a pointer to objects. Therefore to think that Boolean is 3-valued is fundamentally wrongThe syntax for Boolean is abbreviated and conceals the fact that the reference points to Objects:
Boolean a = true;
conceals the fact that true
is an object. Other equivalent assignments might be:
Boolean a = Boolean.TRUE;
or
Boolean a = new Boolean(true);
The abbreviated syntax
if (a) ...
is different from most other assignments and conceals the fact that a might be an object reference or a primitive. If an object it is necessary to test for null
to avoid NPE. For me it is psychologically easier to remember this if there is an equality test:
if (a == true) ...
where we might be prompted to test for null. So the shortened form is only safe when a
is a primitive.
For myself I now have the recommendations:
Boolean
from a method as it could be null
. Only return boolean
.Boolean
for wrapping elements in containers, or arguments to methods where objects are required