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();
    }
}
广告
将在 10 秒后关闭
bannerAds