@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行是否有错误?
1条答案
按热度按时间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为您创建了这个构造函数:
这似乎是一个毫无意义的练习。
因此,lombok将这些字段保留为null,并假设您知道自己在做什么。通常,您之所以使用这些构造函数,要么是因为框架要求您这样做,要么是因为框架将通过立即调用一组setter或反射式更新这些字段来“修复”将字段标记为从不为null并包含null值的问题。
@setter以及lombok的一些特性(@data)。
它们将以相同的方式对参数进行null检查。
@参数上的lombok.nonnull
与之前的功能不同,此功能仅适用于
lombok.NonNull
并且不适用于任何其他非null注解:这将在方法顶部添加null检查。Lombok岛不为其他人这样做的原因是,它是相互矛盾的:如果你考虑的话
@NonNull
作为一个类型注解,它的意思是:这个值不可能为null,它是有保证的,这与它的性质相反:现在null检查是一个编译器错误/警告!就像在写:
这应该是一个编译器错误/警告,因为它不会发生,只是无用的代码。如果你在一个非常严格的空值系统中工作,它会被你的编译器无情地检查,
@NonNull
可以暗示相同的事情,因此,我们不只是添加空检查。@建筑商
是的,这将抛出npe。那是因为
@Builder
类上的语法仅适用于:@AllArgsConstructor
(如果标记为非null的字段的参数为null,则将抛出NPE),然后将@Builder
在这一点上,所有参数都是构造函数。因此,构建器不进行空检查,而是.build()
调用将调用该构造函数,它将调用。