java—将lambda参数传递给构造函数并在lambda中使用对象

egdjgwm8  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(417)

我有这样一个场景:

  1. class ClassB{
  2. ClassB(){
  3. ClassA a = new ClassA(() -> a.foo());
  4. }
  5. }
  6. class ClassA{
  7. ClassA(Runnable onChange) {
  8. }
  9. public void foo(){
  10. System.out.println("Hello");
  11. }
  12. }

我得到“变量'a'可能没有初始化”。我明白为什么会这样。有没有解决的办法或者我必须重新组织我的课程?

uidvcgyl

uidvcgyl1#

我认为你应该考虑重构你的代码并使用不同的方法。没有完整的代码很难说,但我怀疑设计不是最佳的。
说到这里,你可以做一些与你的方法相似的事情。
使classa可运行且抽象:

  1. abstract class ClassA implements Runnable{
  2. private final Runnable onChange;
  3. protected ClassA() {
  4. this.onChange = this;
  5. }
  6. public void foo(){
  7. System.out.println("Hello");
  8. }
  9. }

在classb中,可以实现匿名classa:

  1. class ClassB {
  2. ClassB() {
  3. ClassA a = new ClassA() {
  4. @Override
  5. public void run() {
  6. foo();
  7. }
  8. };
  9. }
  10. }
展开查看全部
tyg4sfes

tyg4sfes2#

在不更改任何类型的情况下,这应该可以工作:

  1. class ClassB {
  2. ClassB() {
  3. AtomicReference<A> ref = new AtomicReference<>(); // holder for instance
  4. ClassA a = new ClassA(() -> ref.get().foo());
  5. ref.set(a);
  6. }
  7. }

但是你不能调用你的lambda( Runnable#run )在构造函数中,因为 a 还是有价值的 null . 只有在构造函数完成之后,才会赋值。
另一种可能是使用 Consumer 而不是 Runnable :

  1. class ClassB {
  2. ClassB() {
  3. ClassA a = new ClassA(that -> that.foo()); // or maybe even: A::foo
  4. }
  5. }
  6. class ClassA {
  7. ClassA(Consumer<A> onChange) {
  8. }
  9. public void foo() {
  10. System.out.println("Hello");
  11. }
  12. }
  13. // call outside of `A`:
  14. consumer.accept(a);
  15. // or, inside of `A`:
  16. consumer.accept(this);

如果看不到代码的其余部分,就很难给出一个好的解决方案。

展开查看全部

相关问题