簡體   English   中英

使用Lombok的顯式構造函數?

[英]Explicit constructor using 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;
    }
}

我仍然是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());
}

此外,此代碼的原始程序員說他允許標頭為“null”,但他明確地創建了一個需要標頭值的構造函數。 我錯過了什么或者這有點矛盾嗎?

看看@ @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

@Data的構造函數行為類似於@RequiredArgsConstructor

@RequiredArgsConstructor為每個需要特殊處理的字段生成一個帶有1個參數的構造函數。 所有final字段都會獲得一個參數,以及標記為@NonNull的任何字段,這些字段在聲明它們的位置未初始化。

鑒於您的字段都不是final@NonNull ,這將導致無參數構造函數。 但是,這不是實現此行為的最具表現力的方式。

在這種情況下,您可能需要的是@NoArgsConstructor (可選地與@AllArgsConstructor結合使用),以清楚地傳達預期的行為,如文檔中所示:

某些java構造(例如hibernate和Service Provider Interface)需要no-args構造函數。 此注釋主要與@Data或生成注釋的其他構造函數組合使用。

如果你正在使用帶有@NonNull字段的@Data並且仍然想要一個noargs構造函數,你可能想嘗試將所有3個注釋一起添加

@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor

顯然是一個舊的intelliJ錯誤,我在Eclipse Kepler和lombok v0.11.4中進行了復制

這一點是矛盾的你是對的。 我之前沒有使用過Lombok,但是如果你想要能夠創建一個bean並且持久存在你需要上面給出的默認構造函數,我就知道了。 它使用Constructor.newInstance()來實例化新對象。

這是一些更詳細的hibernate文檔。

Hibernate文檔

@NoArgsConstructor, 
@RequiredArgsConstructor, 
@AllArgsConstructor

生成不帶參數的構造函數,每個final / non-null字段一個參數,或每個字段一個參數。 閱讀這個lombok項目

@Data
@RequiredArgsConstructor /*Duplicate method Someclass() in type Someclass*/
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)  /*Duplicate method Someclass() in type Someclass*/
@Entity
public class Someclass {      
    @Id
    private  String id;
    private  String name;
    private  Type type; 

    public static enum Type { X , Y, Z}
}

通過使成員變量最終來修復它

@Data
@RequiredArgsConstructor 
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)
@Entity
public class Someclass {

    @Id
    private final String id;
    private final String name;
    private final Type type; 
    public static enum Type { X , Y, Z}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM