Java 谓词实现无法访问全局最终变量



我使用java和springboot创建了一个简单的rest服务。这是我的服务层代码

@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可能没有初始化,我不能在谓词实现中使用它。我尝试将final删除到服务中,这是有效的,但我不想将final移除到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);
}

就其价值而言,如果除了生成userPredicate之外,任何事情都不需要service,那么不妨完全去掉service字段。

最新更新