4

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

根据JEP对记录的描述,“记录在语义上声称是其数据的简单、透明的持有者”。

显然,只有最终字段的泛型类并不完全是其数据的透明持有者,并且在使用记录时,它的final变量会暴露出来,这可能是不可取的。然而,在许多情况下,这可能不是一个大问题。

因此,这是否“足以”将其视为对该语言功能的“滥用”?或者还有其他不那么明显的缺点吗?

@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
    }
}
4

1 回答 1

10

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

考虑记录的最佳方式是它们是名义元组,可以通过行为来增强。(一个有用的类比:Java 枚举之于 C 枚举,就像记录之于结构元组。)这似乎不是您在这里所做的,因此客户端会理所当然地混淆在 API 中作为记录公开的此类,但表现不同。

你可能会问“但是,我为什么不利用这个语言特性来简化这门课的编写呢?” 你当然可以随心所欲,但读代码比写代码更重要。故意使用错误的功能,因为它更容易将作者的便利置于读者的便利之上。

于 2020-04-10T13:09:11.470 回答