Javaでは、nullリテラルは値が存在しないことを表すために使われます。
Javaのプリミティブ型にはすべてデフォルト値があるため、nullになることはありません。慣例として、intのように小文字で始まります。
参照型はオブジェクトのメモリアドレスを保持し、nullを値として持つことができます。一般的にはStringのように大文字で始まります。
プリミティブ型の変数にnullを代入しようとすると、その変数は常に代入された型のプリミティブ値を保持するため、コンパイル時エラーになります。
//Throws compile time error stating the required type is int, but null was provided
int number = null;
参照型の変数にnullを代入しても、参照型の変数はnullを許容するため、コンパイル時エラーにはなりません。
//No error will occur as the String variable str is nullable
String str = null;
この演習では、工場の従業員向けの名札を印刷するコードを書きます。
従業員にはID、名前、部署名があります。従業員の名札のラベルは、次のようにフォーマットします:"[id] - name - DEPARTMENT"。
Badge.print()メソッドを実装して、従業員の名札のラベルを返すようにしましょう:
Badge badge = new Badge();
badge.print(734, "Ernest Johnny Payne", "Strategic Communication");
// => "[734] - Ernest Johnny Payne - STRATEGIC COMMUNICATION"
ラベルでは、部署名を大文字にする必要がある点に注意しましょう。
コンピューターシステムのちょっとした不具合で、新しい従業員が工場で働き始めるときに、まだIDを持っていないことがあります。
名札は必須なので、そのような従業員にはIDのプレフィックスがない一時的な名札が渡されます。まだIDを持っていない新しい従業員に対応できるように、Badge.print()メソッドを変更しましょう:
Badge badge = new Badge();
Badge.print(null, "Jane Johnson", "Procurement");
// => "Jane Johnson - PROCUREMENT"
工場のオーナーも、いつでも名札を着けなければなりません。
ただし、オーナーには部署がありません。この場合は、ラベルに部署名の代わりに"OWNER"と出力します。
オーナー用のラベルを出力できるように、Badge.print()メソッドを変更しましょう:
Badge badge = new Badge();
badge.print(254, "Charlotte Hale", null);
// => "[254] - Charlotte Hale - OWNER"
オーナーが新しい従業員でもある場合があることに注意しましょう:
Badge badge = new Badge();
badge.print(null, "Charlotte Hale", null);
// => "Charlotte Hale - OWNER"