JavaでフィールドとコンストラクタとGetter(場合によってはSetter,equals,toString)しか持たないクラスを書いたことがある人は多いと思います.そのようなクラスはデータクラスと呼ばれれています.
場合によっては似たようなクラスを大量に書かなければならないといけず,いくらIDEのメソッド生成機能を使っても煩わしいことこの上ないですよね.
lombokを使うと多少は軽減されるが,IDEの設定などをしないといけない場合も多く,面倒であることは変わりません.
そんな中,この問題を解決するような機能がJava14で追加されるらしい.
Java14の新機能
Java14ではRecord
なるものが導入されます.
https://blogs.oracle.com/javamagazine/records-come-to-java
使い方は,データクラスにしたいクラスをclass
ではなくrecord
と宣言するらしい.
使用例
使用前
public final class FXOrderClassic {
private final int units;
private final CurrencyPair pair;
private final Side side;
private final double price;
private final LocalDateTime sentAt;
private final int ttl;
public FXOrderClassic(int units,
CurrencyPair pair,
Side side,
double price,
LocalDateTime sentAt,
int ttl) {
this.units = units;
this.pair = pair; // CurrencyPair is a simple enum
this.side = side; // Side is a simple enum
this.price = price;
this.sentAt = sentAt;
this.ttl = ttl;
}
public int units() {
return units;
}
public CurrencyPair pair() {
return pair;
}
public Side side() {
return side;
}
public double price() { return price; }
public LocalDateTime sentAt() {
return sentAt;
}
public int ttl() {
return ttl;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass())
return false;
FXOrderClassic that = (FXOrderClassic) o;
if (units != that.units) return false;
if (Double.compare(that.price, price) != 0)
return false;
if (ttl != that.ttl) return false;
if (pair != that.pair) return false;
if (side != that.side) return false;
return sentAt != null ?
sentAt.equals(that.sentAt) : that.sentAt == null;
}
@Override
public int hashCode() {
int result;
long temp;
result = units;
result = 31 * result +
(pair != null ? pair.hashCode() : 0);
result = 31 * result +
(side != null ? side.hashCode() : 0);
temp = Double.doubleToLongBits(price);
result = 31 * result +
(int) (temp ^ (temp >>> 32));
result = 31 * result +
(sentAt != null ? sentAt.hashCode() : 0);
result = 31 * result + ttl;
return result;
}
@Override
public String toString() {
return "FXOrderClassic{" +
"units=" + units +
", pair=" + pair +
", side=" + side +
", price=" + price +
", sentAt=" + sentAt +
", ttl=" + ttl +
'}';
}
}
大量のGetterとコンストラクタ,Overrideメソッドが並んでいて見るだけでうんざりしますね.
これがJava14ではこうなります.
public record FXOrder(int units,
CurrencyPair pair,
Side side,
double price,
LocalDateTime sentAt,
int ttl) {}
Kotlinみたい
とてもすっきりと宣言できるようになることが分かると思います.
ただし,Setterは用意されないようなので,ORマッパーなどを使う際は注意が必要です.
まとめ
もうKotlinで良いと思う
Java14ではRecord
という強力な新機能が導入されるらしいです.
これでレガシーなコードも簡潔に書き換えることができそうです.
個人的にもこの機能はぜひ使いたいと思っていて,Java8からアップデートしようと考えています!