Lombok构建器检查非null而不是空

use*_*342 13 java builder lombok

我有一个变量类,我不希望它为null或空.有没有办法使用Lombok构建器来设置属性?我可以使用,@NonNull但我无法验证它是否为空.显然,另一种选择是编写我自己的构建器来执行所有这些检查.例如:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 13

Maxim Kirilov的答案是不完整的.它不检查空格/空字符串.

我之前遇到过同样的问题,我意识到除了使用来自Lombok的@NonNull和@Builder之外,还使用私有访问修饰符重载构造函数,您可以在其中执行验证.像这样的东西:

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;
}
Run Code Online (Sandbox Code Playgroud)

此外,当String具有空值,空值或空值时,抛出IllegalArgumentException会更有意义(而不是NPE).


Max*_*lov 8

构建器注释应该可以解决您的问题:

@Builder
class Person {
    @NonNull
    private String firstName;
    @NonNull
    private String lastName;
}
Run Code Online (Sandbox Code Playgroud)

生成的代码是:

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 + ")";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,将在对象构造期间进行空验证.

  • 这个答案完全是错误的 - 问题是关于检查空性和空性,但这个答案对检查空/空白值没有任何作用。这怎么能得到这么多的赞成票,我实在无法理解。 (5认同)
  • 我的问题很好的答案,但它不适用于被问到的问题 - 缺少noteety检查 (3认同)