来自lambda的访问对象在对象的构造函数中传递

问题描述 投票:3回答:2

我有一个带有这个构造函数的Java类MyClass:

public MyClass(Consumer<?> someMethod)

我想这样做:

final MyClass myObject = new MyClass(obj -> { 
    doSomethingOutsideTheContextOfMyObject();
    myObject.doSmomething(obj);
    });

但是我得到一个编译错误,即变量myObject可能没有被初始化。

根据我的研究,我无法切换显示错误的编译器,我不能伪造 - 初始化变量,因为它必须是最终的。我该怎么办?

java lambda constructor new-operator
2个回答
1
投票

我认为你传递给你的构造函数的lambda不应该是Consumer;它应该是一个BiConsumer ......

像这样的东西:

import java.util.function.BiConsumer;

public class MyClass<T> {

    private BiConsumer<MyClass<T>, T> lambda;

    public MyClass(BiConsumer<MyClass<T>, T> lambda) {
        this.lambda = lambda;
    }

    private static void doSomethingOutside() {
        // TODO Auto-generated method stub

    }

    private void doSomething(T obj) {
        // TODO Auto-generated method stub

    }

    public void go(T o) {
        lambda.accept(this, o);
    }

    public static void main(String[] args) {
        MyClass<String> myObj = new MyClass<>((me, obj) -> {
            doSomethingOutside();
            me.doSomething(obj);
        });

        myObj.go("Hello World!");
    }
}

HTH! :)


6
投票

这里:

final MyClass myObject

声明一个新对象myObject。然后你继续:

  = new MyClass(obj -> { 
  doSomethingOutsideTheContextOfMyObject();
  myObject.doSmomething(obj);

在自己的声明中使用相同的myObject

那是不可能的!您正在以循环方式创建“自我引用”!

© www.soinside.com 2019 - 2024. All rights reserved.