Java Predicate实现无法访问全局final变量

use*_*629 4 java lambda

我使用 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);
}
Run Code Online (Sandbox Code Playgroud)

在上面的行中,抱怨变量服务的 ide 可能未初始化,并且我无法在谓词实现中使用它。我尝试删除服务中的final,这有效,但我不想删除TestService 声明中的final。

有人有什么解决办法吗?

rzw*_*oot 6

执行顺序是:首先按词法顺序解析所有初始化表达式(从上到下通过文件),然后运行构造函数。

换句话说,该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);
}
Run Code Online (Sandbox Code Playgroud)

就其价值而言,如果您除了创建 userPredicate 之外不需要service任何东西,不妨完全删除该service字段。