在使用@noargsconstuctor时@nonnull会给出错误吗?

wecizke3  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(289)
@Getter
@Setter
@NoArgsConstructor
public class Company {

    @NonNull
    private String location;

    @NonNull
    private String name;
}

现在如果我写一些类似的东西- Company company = new Company(); company.setLocation("Florida"); company.setName("ABC"); 问题1-在第1行,我是否会得到一个错误,因为创建了一个新对象,但位置和名称为空,并且用 @NonNull ?
问题2-第2行和第3行是否有错误?

i86rm4rw

i86rm4rw1#

这很复杂,因为java社区以不同的方式处理null,“non-null”意味着不同的东西:例如,在db模型类中,它可能意味着: CREATE TABLE 如果要求db框架为您生成表,则db框架生成的语句应在sql中添加NOTNULL约束。但是,由于pojo也应该能够表示半构建的行(例如,表示数据库中unid列的unid字段 null 因为关键是让db使用它的自动序列来填充它,这在您之前是不会发生的 save() 因此,该字段可以并且通常为空!
因此,lombok的非空支持有四个方面,它们都非常不同:

@requiredargsconstructor和@allargsconstructor,以及暗示其中一个(@builder、@data和@value)的所有lombok功能。

lombok处理的任何领域都是 final 或者有某种 NonNull 注解,它明确地认为这意味着在该字段为null的情况下不应该存在任何对象(这明显排除了jpa的notnull!),这是可在中配置的 lombok.config 但是lombok提供了一套相当好的已知的开箱即用的注解,这是“必需的”。
“必需”字段具有以下属性: @RequiredArgsConstructor 将为其创建一个参数。
施工人员由 @RequiredArgsConstructor@AllArgsConstructor 将使用在lombok.config中配置的nullcheck机制对这些字段进行null检查。默认情况下,它是: if (x == null) throw new NullPointerException("x"); .

@诺尔格构装师

这一个是不同的。noargsconstructor不添加空检查。这将是完全没有意义的:如果lombok应该添加它们,那么这意味着唯一正确的答案是lombok为您创建了这个构造函数:

public YourType() {
    throw new NullPointerException("NameOfFirstFieldMarkedNonNull");
}

这似乎是一个毫无意义的练习。
因此,lombok将这些字段保留为null,并假设您知道自己在做什么。通常,您之所以使用这些构造函数,要么是因为框架要求您这样做,要么是因为框架将通过立即调用一组setter或反射式更新这些字段来“修复”将字段标记为从不为null并包含null值的问题。

@setter以及lombok的一些特性(@data)。

它们将以相同的方式对参数进行null检查。

@参数上的lombok.nonnull

与之前的功能不同,此功能仅适用于 lombok.NonNull 并且不适用于任何其他非null注解:这将在方法顶部添加null检查。
Lombok岛不为其他人这样做的原因是,它是相互矛盾的:如果你考虑的话 @NonNull 作为一个类型注解,它的意思是:这个值不可能为null,它是有保证的,这与它的性质相反:现在null检查是一个编译器错误/警告!
就像在写:

public void foo(String x) {
    if (x != null && !(x instanceof String)) throw new IllegalArgumentException("x is not a string");
}

这应该是一个编译器错误/警告,因为它不会发生,只是无用的代码。如果你在一个非常严格的空值系统中工作,它会被你的编译器无情地检查, @NonNull 可以暗示相同的事情,因此,我们不只是添加空检查。

@建筑商

是的,这将抛出npe。那是因为 @Builder 类上的语法仅适用于: @AllArgsConstructor (如果标记为非null的字段的参数为null,则将抛出NPE),然后将 @Builder 在这一点上,所有参数都是构造函数。因此,构建器不进行空检查,而是 .build() 调用将调用该构造函数,它将调用。

相关问题