使用 Java 14 条通用记录(非数据)类 只有最终字段

Using Java 14 Records for generic (non-data) classes with only final fields

给定一个带有 final 字段的简单 class,例如 String(参见下面的示例)或 Spring 依赖项,使用 [=27= 是个好主意] 14条记录使其更简洁,并可能删除注释处理器,如Lombok?

根据JEP描述记录,"Records make the semantic claim of being simple, transparent holders for their data"。

显然,只有 final 字段的通用 class 并不是其数据的完全透明持有者,并且在使用记录时,其 final 变量会暴露,这可能是不可取的.但是,在许多情况下,这可能不是主要问题。

因此,"enough"是否认为它是该语言功能的"abuse"?或者还有其他不太明显的缺点吗?

@RequiredArgsConstructor // or an explicit constructor when not using lombok
class AudienceValidator implements OAuth2TokenValidator<Jwt> {
    private final String audience;

    public OAuth2TokenValidatorResult validate(Jwt jwt) {
        // validate
    }
}


record AudienceValidator(String audience) implements OAuth2TokenValidator<Jwt> {

    public OAuth2TokenValidatorResult validate(Jwt jwt) {
        // validate
    }
}

这取决于这里的预期语义,但根据我在这里看到的情况,这可能是一种滥用。 AudienceValidator 是它的状态吗?它的所有行为是否都源自其状态(norm() 方法源自 Complex 的实部和虚部的方式)?

考虑记录的最佳方式是它们是 名义元组,可以通过行为来增强。 (一个有用的类比:Java 枚举是 C 枚举,记录是结构元组。)这似乎不是你在这里做的,所以客户看到这个 class 会很困惑在 API 作为记录公开,但表现不同。

你可能会问"but, why wouldn't I take advantage of this language feature to make writing this class easier?"你当然可以随心所欲,但是读代码比写代码更重要。故意使用错误的功能,因为它更容易将作者的便利置于 reader 的便利之上。