Java 谓词实现无法访问全局最终变量
Java Predicate implementation can't access global final variable
我使用 java 和 springboot 创建了一个简单的休息服务。这是我的服务层代码
@Service
class MyService {
private final TestService service;
@Autowired
public MyService(final TestService service) {
this.service = service;
}
// here is the issue
private final Predicate<User> userPredicate = (user) -> this.service.isValidUser(user);
}
在上面的行中,ide抱怨变量服务可能没有初始化,我不能在谓词实现中使用它。我尝试删除服务的最终版本,但我不想删除 TestService 声明的最终版本。
有人有解决办法吗?
执行顺序是:首先所有初始化表达式按词法顺序解析(从上到下通过文件),然后构造函数运行。
换句话说,userPredicate =
行在 行 之前运行 this.service = service;
行。它注定会失败,编译器知道这一点,所以它会拒绝编译这段代码。
修复很简单 - 将 userPredicate
初始化移动到构造函数中:
private final TestService service;
private final Predicate<User> userPredicate;
@AutoWired
public MyService(TestService service) {
this.service = service;
this.userPredicate = user -> service.isValidUser(user);
}
不管它的价值如何,如果你不需要 service
除了创建 userPredicate 之外的任何东西,不妨完全摆脱 service
字段。
我使用 java 和 springboot 创建了一个简单的休息服务。这是我的服务层代码
@Service
class MyService {
private final TestService service;
@Autowired
public MyService(final TestService service) {
this.service = service;
}
// here is the issue
private final Predicate<User> userPredicate = (user) -> this.service.isValidUser(user);
}
在上面的行中,ide抱怨变量服务可能没有初始化,我不能在谓词实现中使用它。我尝试删除服务的最终版本,但我不想删除 TestService 声明的最终版本。
有人有解决办法吗?
执行顺序是:首先所有初始化表达式按词法顺序解析(从上到下通过文件),然后构造函数运行。
换句话说,userPredicate =
行在 行 之前运行 this.service = service;
行。它注定会失败,编译器知道这一点,所以它会拒绝编译这段代码。
修复很简单 - 将 userPredicate
初始化移动到构造函数中:
private final TestService service;
private final Predicate<User> userPredicate;
@AutoWired
public MyService(TestService service) {
this.service = service;
this.userPredicate = user -> service.isValidUser(user);
}
不管它的价值如何,如果你不需要 service
除了创建 userPredicate 之外的任何东西,不妨完全摆脱 service
字段。