2017-06-30 6 views
1

変数があるクラスがあります。空でも空でもないようにします。プロパティを設定するロンボクのビルダーを使用する方法はありますか?私は@NonNullを使用することができますが、空であるかどうかを確認することはできません。明らかにもう1つの選択肢は、これらすべてのチェックを行う私自身のビルダーを書くことです。たとえば:ロンボクのビルダーがヌルで、空でないことを確認します。

@Builder 
class Person { 
    @NonNull 
    private String firstName; 
    @NonNull 
    private String lastName; 
} 

生成されたコードは次のとおりです:nullの検証はオブジェクトの構築時に行われます。この場合

class Person { 
    @NonNull 
    private String firstName; 
    @NonNull 
    private String lastName; 

    @ConstructorProperties({"firstName", "lastName"}) 
    Person(@NonNull String firstName, @NonNull String lastName) { 
     if(firstName == null) { 
      throw new NullPointerException("firstName"); 
     } else if(lastName == null) { 
      throw new NullPointerException("lastName"); 
     } else { 
      this.firstName = firstName; 
      this.lastName = lastName; 
     } 
    } 

    public static Person.PersonBuilder builder() { 
     return new Person.PersonBuilder(); 
    } 

    public static class PersonBuilder { 
     private String firstName; 
     private String lastName; 

     PersonBuilder() { 
     } 

     public Person.PersonBuilder firstName(String firstName) { 
      this.firstName = firstName; 
      return this; 
     } 

     public Person.PersonBuilder lastName(String lastName) { 
      this.lastName = lastName; 
      return this; 
     } 

     public Person build() { 
      return new Person(this.firstName, this.lastName); 
     } 

     public String toString() { 
      return "Person.PersonBuilder(firstName=" + this.firstName + ", lastName=" + this.lastName + ")"; 
     } 
    } 
} 

class Person { 
    @NonNull 
    private String firstName; 
    @NonNull 
    private String lastName; 

    public static class PersonBuilder() { 
     // . 
     // . 
     // . 
     public Person build() { 
      //do checks for empty etc and return object 
     } 
    } 
} 

答えて

3

ビルダーアノテーションはあなたの問題を解決する必要があります。

+0

私の質問には良い答えがありますが、尋ねられた質問には適していません - not_emptyチェックはありません –

2

Maxim Kirilovの回答が不完全です。空白/空文字列はチェックされません。

以前は同じ問題に直面していました.Lombokの@NonNullと@Builderの使用に加えて、検証を実行できるプライベートアクセス修飾子を使用してコンストラクタをオーバーロードすることに気付きました。このような何か:文字列は、空白の空またはnull値を持つ場合

private Person(final String firstName, final String lastName) { 
    if(StringUtils.isBlank(firstName)) { 
     throw new IllegalArgumentException("First name can't be blank/empty/null"); 
    } 
    if(StringUtils.isBlank(lastName)) { 
     throw new IllegalArgumentException("Last name can't be blank/empty/null"); 
    } 
    this.firstName = firstName; 
    this.lastName = lastName; 
} 

はまた、はIllegalArgumentExceptionをスローします(代わりにNPEの)より理にかなっています。

関連する問題