在Kotlin中能否修改闭包引用?传递lambda给类后如何变更实现
问题解答
不一定非要重新创建类实例,你可以借助包装类/代理对象间接实现lambda逻辑的切换,无需重新初始化目标类。
举个Java环境下的简单实现思路:
- 先定义一个可切换逻辑的包装类,内部持有当前要执行的lambda:
public class SwitchableAction { private Runnable action; public SwitchableAction(Runnable initialAction) { this.action = initialAction; } // 提供更新逻辑的方法 public void setAction(Runnable newAction) { this.action = newAction; } // 执行当前逻辑的入口 public void execute() { action.run(); } }
- 把包装类实例传给目标类,而非直接传递lambda:
// 初始化包装类,传入初始lambda逻辑 SwitchableAction switchable = new SwitchableAction(() -> System.out.println("初始执行逻辑")); // 将包装类的执行方法传给目标类 TargetClass target = new TargetClass(switchable::execute); // 后续需要变更逻辑时,直接更新包装类内的lambda switchable.setAction(() -> System.out.println("新的执行逻辑")); // 此时目标类触发动作时,会自动执行新逻辑 target.triggerAction();
核心逻辑是:让目标类依赖的不是固定的lambda实例,而是一个能动态切换内部逻辑的中间代理。这种方式无需重建目标类实例,仅更新代理内的逻辑即可实现需求。
如果目标类的设计完全封闭(比如硬编码要求接收特定签名的lambda,且你无法修改目标类代码),那确实只能通过重新创建类实例并传入新lambda的方式来更新实现。
内容的提问来源于stack exchange,提问作者John Glen
相关产品推荐
相关产品推荐

