Java的记录类
这篇文章的目的是什么?
在DDD(领域驱动设计)中,要求值对象是不可变的。如果可能的话,实体对象也应该是不可变的。
因为记录类可以被强制设为不可变的,所以与领域驱动设计(DDD)非常兼容。
无论是DDD还是在面向对象编程时,尽量使对象成为不可变的,这样可以避免因为意外的对象状态变化而陷入无聊的错误之中,我认为这样做是更好的。
目前世界上存在着大量盲目地创建getter/setter的思维停滞的编程,而像Lombok这样的库正助长着这种糟糕编程的大量产生。虽然我不会说”Lombok等于全部都是坏的”,但使用它可以轻松地编写代码(尽管有些不安全),而不用思考为什么要将字段设置为私有,是否真的需要setter,因此我在参与的项目中禁止使用Lombok。
通过积极地使用自Java 16正式实现的记录类,可以确保至少是不可变的,并且无需使用像Lombok这样的库,就能够在语言级别上创建简单且安全的类。因此,本文将介绍基本的写作方式。
唱片课程的功能
-
- フィールドが private finalで強制されオブジェクトがイミュータブルになる
- コンストラクタ、toString、equqls、hashCode 各メソッドが自動実装されコードがシンプルになるため、本当に必要な業務ロジックに注目できる
前提 tí)
(Please note that this is the only option provided for this request, as per the given instructions. However, Chinese is a highly contextual language, and the translation may vary depending on the specific context.)
Java16及以后版本(Java14为预览版)
這個問題
我将分别在传统类和记录类中写出一个通常的ValueObject。
普通的Java类
import java.util.Objects;
public final class Title {
private final String value;
public Title(String value) {
this.value = value;
}
public String value() {
return value;
}
@Override
public boolean equals(Object obj) {
if (obj == this) return true;
if (obj == null || obj.getClass() != this.getClass()) return false;
var that = (Title) obj;
return Objects.equals(this.value, that.value);
}
@Override
public int hashCode() {
return Objects.hash(value);
}
@Override
public String toString() {
return "Title[" +
"value=" + value + ']';
}
}
与上述相同义的记录类
变得超级简单
public record Title(
String value
) {
}
可以覆盖构造函数
public record Title(
String value
) {
public Title(String value){
this.value = value + "hoge";
}
}
可以进行 Bean 验证
import javax.validation.constraints.NotEmpty;
public record Title(
@NotEmpty(message = "タイトルを入力してください")
String value
) {
}
可以实现任何方法
public record Title(
String value
) {
public int length() {
return this.value.length();
}
}