はじめに
Javaも早いもので、もうすぐJDK15がリリースされます!(2020年9月予定)
ただ、その一つ前のJDK14も、あまりキャッチアップできていないのが正直なところでした・・・。
色々と調べていて、 Records
という概念がJDK14でPreview版リリースされたことを知ったので、ちょっと記事を書いてみました。
※ Preview版ということで、JDK15以降ではまた形が変わるかもしれません。予めご了承ください。
Recordsとは
下記です。
https://openjdk.java.net/jeps/359
データ保存用としてrecordが提供されるようになり、
これを付与したクラスは結果として変更不可能(immutable)なオブジェクトとなります。
具体的には下記のような形になります。
record Point(int x, int y) { }
上記は結果として以下のクラスとなります。
class Point extends Record {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int x() {
return x;
}
public int y() {
return y;
}
public int hashCode() { ... }
public boolean equals() { ... }
public String toString() { ... }
}
上記のように、コンストラクタ以外からフィールド変数にアクセスできず(immutable)、
equals
hashCode
toString
のメソッドを実装したクラスが生成されます。
引数の値は、下記のようにチェック可能なようです。
record Point(int x, int y) {
public Range {
// yにx未満の値のみ設定可能とする場合
if (x > y) throw IllegalArgumentException();
// 下記のように明示的に設定しなくても、値の設定をしてくれる。
// this.x = x;
// this.y = y;
}
}
所感
まだPreview版なので今後どのようになるのかは不明ではありますが、
DTOで用いたり、 Record
を用いることで直感的に理解可能になったりするのではと思いました。
名前付きtupleである、という表現が個人的に一番しっくりきました。
より深く知りたい方は、下記の記事が非常によくわかりやすかったです。
https://www.infoq.com/jp/articles/java-14-feature-spotlight/
Javaもどんどん進化していきますね・・・。ちゃんとキャッチアップしていきます。
読んでいただきありがとうございました!