Java 从传入对象&x27;的lambda访问对象;s构造函数
我有一个Java类MyClass,它具有以下构造函数:Java 从传入对象&x27;的lambda访问对象;s构造函数,java,lambda,constructor,new-operator,Java,Lambda,Constructor,New Operator,我有一个Java类MyClass,它具有以下构造函数: public MyClass(Consumer<?> someMethod) 但我得到一个编译器错误,变量myObject可能没有初始化 根据我的研究,我不能切换显示错误的编译器,也不能假装初始化变量,因为它必须是最终的。我该怎么办?这里: final MyClass myObject 声明一个新对象myObject。然后你继续说: = new MyClass(obj -> { doSomethingOuts
public MyClass(Consumer<?> someMethod)
但我得到一个编译器错误,变量myObject可能没有初始化
根据我的研究,我不能切换显示错误的编译器,也不能假装初始化变量,因为它必须是最终的。我该怎么办?这里:
final MyClass myObject
声明一个新对象myObject
。然后你继续说:
= new MyClass(obj -> {
doSomethingOutsideTheContextOfMyObject();
myObject.doSmomething(obj);
在自己的声明中使用非常相同的myObject
那是不可能的!您正在以循环方式创建“自我参考” 我认为传递给构造函数的lambda不应该是消费者;它应该是一个双消费者 诸如此类:
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!");
}
}
import java.util.function.BiConsumer;
公共类MyClass{
私人双消费者lambda;
公共MyClass(双消费者lambda){
this.lambda=lambda;
}
私有静态void doSomethingOutside(){
//TODO自动生成的方法存根
}
私人无效剂量测定(T obj){
//TODO自动生成的方法存根
}
公开作废go(TO){
lambda.接受(这个,o);
}
公共静态void main(字符串[]args){
MyClass myObj=新的MyClass((me,obj)->{
doSomethingOutside();
me.doSomething(obj);
});
去吧(“你好,世界!”);
}
}
嗯!:)请考虑扩展<代码> MyClass <代码>添加实现这种lambda的成员方法吗?这个lambda是否会随着构造函数调用的变化而变化,或者实际上是固定的?否则,下面的双消费者解决方案就是正确的选择。我就是这样做的。而且它甚至不像最初看起来那么尴尬。
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!");
}
}