Setter 注释在 Java class 中不起作用

Setter annotation is not working in Java class

我的工作区结构如下:

 package1
     Class A
 package 2
    Class B

class A 添加了所有注释:

@Getter
@Setter
@Value
@Data
@ToString
@Builder
class A {
    int a,
    int b
}

但是当我尝试在 class B 中使用 A.setA(1) 时,我得到错误提示 setA 不是定义的函数。

我在配置中包含了以下依赖项:

LombokUtils = 1.1;
Lombok = 1.16.x; 

不确定这里出了什么问题。 @Setter 注释无效。

不工作因为在 class A 你需要 import lombok.Getter;import lombok.Setter; 现在在您的 B class 中您应该可以访问 setter。 您可以获得更多信息Here

@Value(这有助于创建不可变的 classes)和 @Setter(它添加了改变 class 状态的方法)之间存在冲突。

删除@Value注释,你应该在class A中有setter。

将 class A 的可见性更改为 public 并尝试

@Getter

这告诉 lombok 制作吸气剂。但是,@Data 也是如此,@Value 也是如此。这个注释没有意义;删除它。

@Setter

这告诉 lombok 为所有非最终字段制作 setters (剧透:你的字段在这里是最终的,所以没有 setters制成)。但是,@Data 也这样做 - 它也意味着:为每个非最终字段制作一个 setter。这个注释没有意义;删除它。

@Value

这告诉 lombok 将 class 设置为 final,将所有字段设置为 final,将所有字段设置为私有,创建一个设置所有字段的构造函数,创建一个toString,制作 getter,制作 hashcode 和 equals 方法。

因为它使所有字段成为最终字段,所以 @Setter 什么都不做。

@Data

您不应该用 Data 和 Value 注释 class:它们是相反的。如果您打算让这些字段可设置,您正在寻找 @Data,而不是 @Value。删除其中一个。

@ToString

Data 和 Value 都已经这样做了;这个注释没有意义;删除它。

@Builder

其他任何东西都没有暗示,所以保留它。

我很确定你想要:

@Data @Builder class Foo {
}

仅此而已。实际上,你有构建器,所以你可能想要一个不可变的 class (所以,根本没有 setter - 你构建了一个实例,然后它就不可更改),在这种情况下,你正在寻找@Value @Builder class Foo {}.

基于lombok的参考here:

@Value is the immutable variant of @Data; all fields are made private and final by default, and setters are not generated.

@Value 创建不可变的 classes,而 @Setter 通过添加 setter 使 classes 可变。

所以为了让设置器删除@Value

在没有@Value 的情况下检查一下:

package com.samples.demo.pacakge1;

import lombok.*;

@Data
@Getter
@Setter
@Builder
//@Value
@ToString
public class A {
    int x;
    int y;
}

和class乙:

package com.samples.demo.package2;

import com.samples.demo.pacakge1.A;

public class B {
    public static void main(String[] args) {
        A a = A.builder().build(); //can't use A a=new A();
        a.setY(12);
        System.out.println(a.getY());

    }
}