使用Lombok的显式构造函数?

Fin*_*005 16 java hibernate lombok

我正在重写一些管理数据库的混乱代码,并看到原始程序员创建了一个映射到数据库的类,如下所示:

(我删除了在这个问题上没有用处的不必要的代码)

@Entity
@Data
@EqualsAndHashCode(callSuper = false, of = { "accessionCode", "header", "date" })
@SuppressWarnings("PMD.UnusedPrivateField")
public class PDBEntry implements Serializable {
    @Id
    @NaturalId
    @NotEmpty
    @Length(max = 4)
    private String accessionCode;

    @NaturalId
    @NotEmpty
    private Date date;

    @NaturalId
    // We allow for the header to be 'null'
    private String header;

    private Boolean isValidDssp;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastUpdated = new Date(System.currentTimeMillis());

    protected PDBEntry(){}

    public PDBEntry(String accessionCode, String header, Date date){
        this.accessionCode = accessionCode;
        this.header = header;
        this.date = date;
    }
}
Run Code Online (Sandbox Code Playgroud)

我仍然是Hibernate的初学者并使用Lombok,但是这不会做同样的事情并且Lombok不会自动为你创建所需的构造函数吗?

@Entity
@Data
@SuppressWarnings("PMD.UnusedPrivateField")
public class PDBEntry implements Serializable {
    @Id
    @NaturalId
    @NotEmpty
    @NonNull
    @Length(max = 4)
    private String accessionCode;

    @NaturalId
    @NotEmpty
    @NonNull
    private Date date;

    @NaturalId
    // We allow for the header to be 'null'
    private String header;

    private Boolean isValidDssp;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastUpdated = new Date(System.currentTimeMillis());
}
Run Code Online (Sandbox Code Playgroud)

此外,此代码的原始程序员说他允许标头为"null",但他明确地创建了一个需要标头值的构造函数.我错过了什么或者这有点矛盾吗?

Tim*_*Tim 16

看看@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor.

构造函数的行为@Data如下@RequiredArgsConstructor:

@RequiredArgsConstructor为每个需要特殊处理的字段生成一个带有1个参数的构造函数.所有final字段都会获得一个参数,以及标记为@NonNull的任何字段,这些字段在声明它们的位置未初始化.

鉴于您的字段都不是final或者@NonNull,这将导致无参数构造函数.但是,这不是实现此行为的最具表现力的方式.

在这种情况下,您可能想要的是@NoArgsConstructor(可选地与a组合@AllArgsConstructor),以清楚地传达预期的行为,如文档中所示:

某些java构造(例如hibernate和Service Provider Interface)需要no-args构造函数.此注释主要与@Data或生成注释的其他构造函数组合使用.

  • 好的,只是对于那些也开始使用Lombok的人来说,我只是听说@RequiredArgsConstructor不是很健壮,它需要你的类中的字段顺序来构建构造函数,所以如果其他人改变了这个顺序你的代码那么调用构造函数停止工作,因此结果显式构造函数仍然是更好的选择.但是,如果您使用的是Hibernate,@ NoArgsConstructor(access = AccessLevel.PROTECTED)似乎确实很有用.谢谢大家的帮助. (3认同)