2017-07-27 2 views
1

私はいくつかのフィールドを継承するクラスを持っています。その中には、私のIDフィールドとオブジェクトの違いがあります。 私は@EqualsAndHashCodeと@ToStringを生成するためにlombokを使用していますが、スーパークラスのバージョンを使用したいだけで、クラスのすべてのフィールドを除外します。 除外を使用せずにすべてのフィールドを追加する方法があるのだろうかと思います。@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メソッドでは、組織やスキルを取得等しいとhashCodeます。私は使用することができ、それらを除外する

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

私は例より多くのフィールドがあり、将来的にはより多くをそこに来るかもしれないと私はすべてのものを除いて除外することができればしかし、私は好みます私のスーパークラス。

of = {}で1つのフィールドを追加することもできます。

これを達成するための方法はありますか?

+1

私は長い時間でlombockを使用していないと思いますので、

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

を書くことができます。あなたは従業員クラスから注釈を削除することができます。あなたのクラスにはequlasとtoStringはなく、superは自動的に呼び出されます –

+0

これは本当ですが、私はデータを削除して '@ Getter'と' @Setter '代わりに、それは主要な目標であるよりきれいなビューを提供します:) 乾杯 – Larvalis

答えて

3

ない単に

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

働くだろうか?ロンボクはスーパークラスのフィールドについては何も知らないので(この情報は実行時に利用できないため)、idを含めることも、nameを除外することもできません。あなたができることは、super.toString()に電話をかけることだけです。フィールドをまったく含まない場合、

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

のようなものが得られますが、これはあなたが望むものかもしれません。あなたの代わりにあなただけの

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

はい、どういうわけか私は私の頭の中に少なくとも' {} 'の中に少なくとも1つのフィールドを必要としていました。このソリューションは、あなたが思っているよりもシンプルです: – Larvalis

関連する問題