Lombok的staticConstructor适配多静态构造场景吗?能否用@Value替换现有注解?
问题描述
现有如下Java类:
@AllArgsConstructor(access = AccessLevel.PRIVATE) @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @Getter public class MyClass { Integer mField1; String mField2; // 无公共构造方法,禁止调用(null, null)或(field1, field2) // 仅传入field1时的工厂式构造方法 public static MyClass fromField1(@NotNull final Integer field1) { return new MyClass(field1, null); } // 仅传入field2时的工厂式构造方法 public static MyClass fromField2(@NotNull final String field2) { return new MyClass(null, field2); } }
能否将其中的三个注解:
@AllArgsConstructor(access = AccessLevel.PRIVATE) @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @Getter
替换为@Value(...)?如果可以,该如何操作?
另外有两个疑问:
- 不知道如何处理多个静态构造方法的场景;
- 感觉
staticConstructor只能生成包含全部参数的静态构造方法,而我不想暴露它,只保留现有的两个静态“构造方法”。
解决方案
完全可以用@Value替换原来的三个注解,具体操作和注意事项如下:
1. 基础替换方式
直接用@Value注解替代原来的三个注解即可,不需要额外配置参数。修改后的代码如下:
@Value public class MyClass { Integer mField1; String mField2; // 无公共构造方法,禁止调用(null, null)或(field1, field2) // 仅传入field1时的工厂式构造方法 public static MyClass fromField1(@NotNull final Integer field1) { return new MyClass(field1, null); } // 仅传入field2时的工厂式构造方法 public static MyClass fromField2(@NotNull final String field2) { return new MyClass(null, field2); } }
2. 为什么这样可行?
@Value注解默认的行为刚好完全匹配你原来三个注解的组合效果:
- 自动将所有字段设置为
private final(对应@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)) - 自动生成一个私有的全参构造方法(对应
@AllArgsConstructor(access = AccessLevel.PRIVATE)) - 自动生成所有字段的Getter方法(对应
@Getter)
3. 针对你的疑问的说明
关于多静态构造方法
@Value的staticConstructor参数确实只能指定一个静态工厂方法的名称(用来生成全参的静态构造器),但你完全不需要配置这个参数——你手动编写的fromField1和fromField2两个静态方法不会被@Value覆盖或干扰,它们可以正常调用@Value生成的私有全参构造方法创建实例。
关于避免暴露全参静态构造方法
只要不配置staticConstructor参数,@Value就不会生成全参的静态工厂方法。外部代码仍然无法直接调用new MyClass(...)(因为构造方法是私有的),也无法通过自动生成的静态方法创建实例,完全符合你“只保留自定义两个静态构造方法”的需求。
内容的提问来源于stack exchange,提问作者jeancallisti
相关产品推荐
相关产品推荐

