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 字段。