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());
}
}
我的工作区结构如下:
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());
}
}