在 Java 类的构造过程中,成员变量的初始化顺序先于构造器的执行
@AllArgsConstructor
public class OAPushDataService {
private final AliOssProperties aliOssProperties;
private final ProjectService projectService;
private final SeeYonOaApiUtils oaApiService;
private final SeeYonOaApiProperties oaApiProperties;
private final EmployeeService employeeService;
private final String visitUrl = aliOssProperties.getVisitUrl();
在 Java 类中,当你使用 @AllArgsConstructor 注解时,Lombok 会自动为你生成一个包含所有 final 字段的构造器。然而,你遇到的问题是在字段声明的同时尝试使用这些字段来初始化其他字段。在 Java 类的构造过程中,成员变量的初始化顺序是先于构造器的执行。这意味着在构造器内部赋值之前,你尝试使用 aliOssProperties 来初始化 visitUrl,此时 aliOssProperties 还没有被初始化,因此编译器会报错,指出 “可能尚未初始化变量aliOssProperties”。
要解决这个问题,有几个选项:
1. 在构造器中初始化 visitUrl
你可以不在字段声明时初始化 visitUrl,而是在构造器中进行初始化。如果你使用 Lombok,可以手动编写构造器,或者使用 Lombok 的 @PostConstruct 方法来设置 visitUrl。
@PostConstruct
public void init() {
visitUrl = aliOssProperties.getVisitUrl();
}
2. 使用 Lombok 的 @Getter(lazy=true) 注解
另一种方法是延迟 visitUrl 的初始化,让 Lombok 在首次访问时才进行计算。
@Getter(lazy = true)
private final String visitUrl = aliOssProperties.getVisitUrl();