2017-07-27 159 views
1

我有一個班,我繼承了一些領域,其中我的id領域和那些我對這個對象的區別。 我正在使用lombok生成我的@EqualsAndHashCode和@ToString,但只想使用我的超類的版本,並排除了我的類中的所有字段。 我想知道是否有辦法做到這一點,而不使用排除,然後添加所有字段。在@EqualsAndHashCode和@ToString中使用callsuper的更好方法?

我的課:

@EqualsAndHashCode(of = { "id" }) 
@ToString(of = { "id", "email", "name" }) 
@Data 
public abstract class Resource { 
    @Id 
    private Integer id; 

    private String name; 

    private String email; 
} 

@EqualsAndHashCode(callSuper = true) 
@ToString(callSuper = true) 
@Data 
public class Employee extends Resource { 
    private Organisation organisation; 

    private List<Skill> skills = new ArrayList<Skill>(); 
} 

在這裏,我會得到組織和技能在我的ToString,equals和hashCode。

要排除他們,我可以使用:

@ToString(callSuper = true, exclude = { "organisation", "skills" }) 

但是因爲我有比這個例子更領域,並有可能出現更多的在未來,我希望如果我能排除一切除了從那些我的超級班。

我還可以用of = {}添加一個字段。

有沒有更好的方法來實現它?

+1

我沒有用lombock在很長一段時間。但你可以從你的員工類中刪除註釋。這種方式沒有equlas和toString在你的班級和超級被自動調用 –

+0

這是真的,我使用'@ data'來獲得一些額外的東西,但如果我刪除數據並添加'@ Getter'和'@Setter '相反,它提供了一個更清晰的視圖,這是主要目標:) 乾杯 – Larvalis

回答

3

並不是簡單

@ToString(callSuper = true, of = {}) 

工作? Lombok對超類字段一無所知(因爲該信息在運行時不可用),並且不能包含id或排除name。你所能做的就是致電super.toString()。當你根本不包含字段時,那麼你得到類似於

Employee(super=Resource(43, Larvalis, [email protected])) 

這可能或可能不是你想要的。你可以代替寫

public String toString() { 
    return getClass().getSimpleName() 
     + super.toString().replaceFirst("^[^(]+", ""); 
} 

所以你得到的只是

Employee(43, Larvalis, [email protected]) 
+1

是的,不知怎的,我進入了我的腦海,我至少需要1個字段在'= {}內。解決方案通常比您想象的要簡單:/ – Larvalis