statusの事故を二度と起こさせない
## ストーリー
TicketCraftの`Ticket`クラスは、今すべてのフィールドが`public`です。先週、こんな事故が起きました。
```java
Ticket ticket = new Ticket("T-42", "通知バッチが落ちる");
ticket.status = "wip"; // 本来は "in_progress" が正しい表記だった
```
`status`に本来と違う文字列が入ってしまい、「対応中のチケットを通知する」バッチ処理がこのチケットだけ検知できず、対応漏れが発生しました。原因は単純です。`status`フィールドが`public`で、誰でもどんな文字列でも直接代入できてしまうからです。
記事「[カプセル化の基本と実践](https://nanade.net/blog/oop-encapsulation/)」で学んだ「受付を1つに絞る」考え方を使って、この事故が二度と起きないように`Ticket`クラスを直してください。
## 課題
雛形の`Ticket`クラスを、次の条件をすべて満たすように書き換えてください。
1. すべてのフィールドを`private`にする
2. `id`・`title`は**コンストラクタ`Ticket(String id, String title)`で設定し、getterのみ**を用意する(`setId`・`setTitle`は用意しない。発行済みのidを後から書き換えられないようにするため。IDEの自動生成機能で誤って作ってしまわないよう注意)
3. `status`はコンストラクタで`"open"`に初期化する。getterに加え`setStatus(String)`を用意し、`"open" / "in_progress" / "resolved" / "closed"`以外の値(`null`を含む)を渡されたら`IllegalArgumentException`を投げる
4. `assignee`はgetter/setterを用意し、`setAssignee(String)`は`null`または空文字(前後空白のみを含む)を渡されたら`IllegalArgumentException`を投げる
## 手順
1. **Step 1**: 4つのフィールド(`id`・`title`・`status`・`assignee`)をすべて`private`にする
2. **Step 2**: コンストラクタ`Ticket(String id, String title)`を追加し、`id`・`title`を設定、`status`は`"open"`で初期化する。4つのgetterを用意する(`id`・`title`はgetterのみでよい)
3. **Step 3**: `setStatus(String)`を追加し、許可された4つの値以外(`null`も含む)なら`IllegalArgumentException`を投げる
4. **Step 4**: `setAssignee(String)`を追加し、`null`・空文字(`isBlank()`で判定)なら`IllegalArgumentException`を投げる
## 期待される実行結果の例
```java
Ticket ticket = new Ticket("T-1", "バグ修正");
ticket.getStatus(); // => "open"
ticket.setStatus("in_progress");
ticket.getStatus(); // => "in_progress"
ticket.setStatus("wip"); // => IllegalArgumentException が発生する
ticket.setStatus(null); // => IllegalArgumentException が発生する(NullPointerExceptionではない)
ticket.setAssignee(null); // => IllegalArgumentException が発生する
ticket.setAssignee("alice");
ticket.getAssignee(); // => "alice"
```
提出すると、この記事と同じ観点の隠しテスト(合計9件)で自動採点されます。全件通過で合格です。