前回でWebサーバー上のプログラムとWebブラウザとの通信ができるようになりました。
次に「モデル」を作っていきます。
モデルとは、「アプリケーションで使用するデータを保持する部分」になります。
今回作成するWebアプリケーションでは「タスク情報を保持する部分」に該当します。
まず、今回作成するタスク管理アプリケーションで、1つのタスクにどのような情報を保持するか確認します。わかりやすく表にするのが良いです。
ここからどのようにモデルの部分を作成するかになります。
モデルは通常、保持したい情報をフィールド値に格納する形のクラスとして宣言しますが、情報を格納するためのクラスになるので、Java17以降ではレコードを使って宣言することができます。
レコードに関しては以下の記事にまとめてあります。
【record】違う種類の値をまとめて扱うレコードとは何が便利か・・・ - たなかのJava日記
レコード名をTaskItemとして宣言してみます。
record TaskItem(String id, String task, String deadline, boolean done) {}
このTaskItemレコードは1つのタスク情報を保持するためのものです。
タスクはいくつもあるのが当然なので、タスク管理アプリケーションでは複数のタスクを登録できるようにしなければなりません。
要はレコード(タスク)をいくつも格納できる仕組みが必要です。
いくつも格納できる仕組みがあることで、レコード(タスク)をまとめて管理できます。
複数の値をまとめて管理する仕組みはJavaにはいくつかありますが、ここではArrayListクラスを利用します。ArrayListは変更のできる(随時追加可能な)Listなので、いくつ追加するか未定なタスク管理にはもってこいです。次のように複数のTaskItemオブジェクトを格納するフィールドを用意します。
private List<TaskItem> taskItems = new ArrayList();
型の指定をTaskItemにしているのは、
Listで扱う(格納する)オブジェクト(タスク)がTaskItem型だからです。
左辺がList型になっている理由は、
「ざっくりListとして扱う方がメリットが大きい」からです。
ArrayListやLinkedListなどのListは、両者ともjava.util.Listインターフェースを実装しています。get()、remove()、size()などは全てListインターフェースに実装してあるメソッドになります。なのでListにArrayListは格納が可能であり、基本的なメソッドも使用可能です。また、メリットとしては、Listとしてざっくり扱っていてもその後の実装の違いを気にすることは少ないので、他のListも受け渡し可能にしておけば、その後の変更など含めて中身の受け渡しが容易になります。Listに関してはどうやら定石のようです。
引数、戻り値、ローカル変数には極力あいまいな型(インターフェース型)を利用できないかを検討し、積極的利用するのが良いとされています。
話がそれてしまいましたが、先ほどの2つの宣言をHomeRestControllerクラスの先頭部分に追加すると、次のようなコードになります。なお、taskItesのようなフィールドについても、以下URLでのメソッドと同様の理由でインスタンス変数として宣言することが原則となっています。
【Spring Boot】クラスのメソッドに決まりはあるのか - たなかのJava日記
これで、omeRestControllerクラスに、タスク情報を保持するための入れ物が用意できました。