如何访问注入的构造函数的实例变量 class 在 lambda 中使用
How to access instance variables of a constructor injected class be used inside lambda
客户 class 使用构造函数注入(推荐通过字段注入),但实例字段在 lambda 中不可用。
@Component
public class Customer {
private final Account account;
@Autowired
public Customer(final Account account) {
this.account = account;
}
// Works perfectly fine
Callable propCallable = new Callable<String>(){
@Override
public String call() throws Exception {
return account.accountId();
}
};
//Shows warning : Variable account might not have been initialized
Callable lambdaCallable = () -> {
return account.accountId();
};
}
我只是想知道是否有更好的方法在 lambda 中使用实例变量,而不是匿名 class?
注意:我更愿意将帐户保留为最终帐户。
提前致谢
将 lambdaCallable
定义移动到构造函数内部:
private final Callable<Long> lambdaCallable;
@Autowired
public Customer(final Novel account) {
this.account = account;
lambdaCallable = account::getId;
}
在匿名 class 和 lambda 之间有一些 differences。在这种情况下,主要的是:
Compilation – Anonymous compiles to a class, while lambda is an invokedynamic instruction
现在关于编译器错误。通过 Java order of initialization rules,您的 lambda 初始化发生在构造函数中的 'account' 赋值之前。不确定,但是由于编译差异,匿名 class 没有这样的错误。
因此,您可以return lambda from 方法,或将'lambdaCallable' 初始化移动到构造函数。
public class DemoApplication {
public class Customer {
private final Account account;
public Customer(final Account account) {
this.account = account;
}
// Works perfectly fine
Callable propCallable = new Callable<String>(){
@Override
public String call() throws Exception {
return account.accountId();
}
};
Callable getCallable() {
return account::getId;
}
// Callable lambdaCallable = () -> {
// return account.accountId();
// };
}
}
客户 class 使用构造函数注入(推荐通过字段注入),但实例字段在 lambda 中不可用。
@Component
public class Customer {
private final Account account;
@Autowired
public Customer(final Account account) {
this.account = account;
}
// Works perfectly fine
Callable propCallable = new Callable<String>(){
@Override
public String call() throws Exception {
return account.accountId();
}
};
//Shows warning : Variable account might not have been initialized
Callable lambdaCallable = () -> {
return account.accountId();
};
}
我只是想知道是否有更好的方法在 lambda 中使用实例变量,而不是匿名 class?
注意:我更愿意将帐户保留为最终帐户。
提前致谢
将 lambdaCallable
定义移动到构造函数内部:
private final Callable<Long> lambdaCallable;
@Autowired
public Customer(final Novel account) {
this.account = account;
lambdaCallable = account::getId;
}
在匿名 class 和 lambda 之间有一些 differences。在这种情况下,主要的是:
Compilation – Anonymous compiles to a class, while lambda is an invokedynamic instruction
现在关于编译器错误。通过 Java order of initialization rules,您的 lambda 初始化发生在构造函数中的 'account' 赋值之前。不确定,但是由于编译差异,匿名 class 没有这样的错误。
因此,您可以return lambda from 方法,或将'lambdaCallable' 初始化移动到构造函数。
public class DemoApplication {
public class Customer {
private final Account account;
public Customer(final Account account) {
this.account = account;
}
// Works perfectly fine
Callable propCallable = new Callable<String>(){
@Override
public String call() throws Exception {
return account.accountId();
}
};
Callable getCallable() {
return account::getId;
}
// Callable lambdaCallable = () -> {
// return account.accountId();
// };
}
}