Lombok如何定制Boolean对象字段的getter?

95


我的一个POJO有一个Boolean对象字段,以允许在数据库中使用NULLS(这是一个要求)。是否可以在类级别上使用@Data Lombok注释,但覆盖布尔字段的getter方法?它生成的默认方法是用于布尔字段的getXXX方法。我希望将其覆盖为isXXX()方法。

谢谢,
Paddy


根据定义,覆盖(overriding)意味着编写自己的 getXXX 方法来替代 lombok 提供的方法。如果您想添加自己的 isXXX 方法,则需要使用不同的方法。为什么不在您的 POJO 中创建一个 isXXX 方法,在实现中,如果需要,调用 getXXX 或按照您喜欢的方式实现它呢? - Jayz
我已经在类级别上声明了@Data,并且在类中有太多属性,因此要么排除getter,要么将默认getter设置为一个字段的私有,这将是困难的。否则,即使我添加了isXXX方法,getXXX方法仍然会对类的用户可见 - 我宁愿使用getXXX方法本身。希望您能理解我的上下文。 - Paddy
5个回答

155

虽然有些冗长,但您可以提供自己的isXXX,然后使用AccessLevel.NONE告诉Lombok不要生成getXXX

@Data
public class OneOfPaddysPojos {

    // ... other fields ...

    @Getter(AccessLevel.NONE)
    private Boolean XXX;

    public Boolean isXXX() {
        return XXX;
    }
}

(嘿,起码不像没有使用Lombok时那么啰嗦了!)


20

我认为,如果您将字段从 Boolean X 切换到 boolean X,那么 lombok 会生成一个名为 isX() 的 getter 方法。


17
没错,但是如果数据库的列可为空,你需要将这个字段设为布尔型。问题在于,对于原始类型(比如布尔型),你无法确定某个值到底是应该是NULL还是0。这就是楼主提出问题的原因。 - Priidu Neemre
谢谢。这对我有用。 - undefined

13

我知道这个问题很久了,但我会把这留做将来参考。

你有两个选项来覆盖类中的Getter/Setter方法。

一个是第一个选项回答所述的内容。

另一个选项是简单地定义Getter/Setter方法,lombok 就不会自动产生指定的方法。

我亲自测试过,似乎可行:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ProductResponse {

    private UUID id;
    private String supplierId;
    private String sku;
    private String name;
    private String brand;
    private String imgUrl;
    private String description;
    private BigDecimal price;
    private Float quantity;
    private String unit;
    //@Getter(AccessLevel.NONE) //This means @Data will not produce a getter for this field so have to explicitly define it
    private Set<ProductTag> tags;

    //Here we override @Data getter with a different getter (return is different type)
    public List<UUID> getTags() {
    return     tags.stream().map(ProductTag::getId).collect(Collectors.toList());
    }
}

这里还有来自开发团队评论的参考:Lombok的开发人员评论

在我的示例中,我正在使用“override”功能来处理集合类型,但是这也可以用于你的任何其他类型,比如你的Boolean


4
如果您定义的自定义getter的名称与lombok应该生成的名称匹配,那么它将“起作用”。如果名称不匹配,例如在此情况下,当您的getter方法分别为isXXX()getXXX()时,OP问如何解决。请注意,这里的“起作用”指的是自动生成getter方法功能正常,与自定义getter方法具有相同的操作效果。 - Sasha Shpota
好的发现!谢谢你指出了这个问题,我在题目中忽略了它。 - Rafael R. S. Robles

2
布尔值字段的名称是什么? 根据 Lombok文档
默认getter方法只是返回该字段,并且如果该字段名为foo(或者该字段的类型是布尔值),则其名称为getFoo或isFoo。 Lombok将为您的布尔字段生成名为isXXX的getter方法。

14
你似乎有些困惑。原帖的作者显然知道一个boolean类型的字段的getter默认会被命名为isXXX();问题在于他/她希望对于一个Boolean类型的字段也使用这种命名规范(Booleanboolean对象包装类型,就像Integer对应于int一样)。你提供的链接页面实际上明确指出了这一点:“任何变体的boolean都不会使用is前缀而不是get前缀;例如,返回java.lang.Boolean会导致使用get前缀,而不是is前缀。” - ruakh

1

来自Lombok 文档

您始终可以使用特殊的AccessLevel.NONE访问级别手动禁用任何字段的getter/setter生成。这使您可以覆盖类上的@Getter、@Setter或@Data注释的行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接