OptaPlanner中LambdaMetafactory快速访问的差异原因及要求
OptaPlanner变量访问方式差异及快速访问要求
你提供的OptaPlanner日志如下:
[TRACE] [2023-09-24 17:25:14,657] [main] [o.o.c.i.d.s.d.SolutionDescriptor] Model annotations parsed for solution MySolution: [TRACE] [2023-09-24 17:25:14,658] [main] [o.o.c.i.d.s.d.SolutionDescriptor] Entity MyClass1: [TRACE] [2023-09-24 17:25:14,658] [main] [o.o.c.i.d.s.d.SolutionDescriptor] Genuine variable interval (pretty fast access with LambdaMetafactory) [TRACE] [2023-09-24 17:25:14,658] [main] [o.o.c.i.d.s.d.SolutionDescriptor] Entity MyClass2: [TRACE] [2023-09-24 17:25:14,659] [main] [o.o.c.i.d.s.d.SolutionDescriptor] Shadow variable events (slow access with reflection)
访问方式差异的原因
- MyClass1的变量是原始规划变量(Genuine variable):这类变量的访问逻辑简单直接,OptaPlanner可以提前通过
LambdaMetafactory生成动态代理,直接调用变量的getter/setter方法,完全避开反射的性能损耗,所以速度更快。 - MyClass2涉及**影子变量(Shadow variable)**的事件处理:影子变量的取值依赖于其他变量的变化,其触发逻辑涉及复杂的依赖追踪,无法提前生成稳定的Lambda代理逻辑,只能通过反射动态调用相关方法,因此访问速度较慢。
实现快速访问的要求
要让OptaPlanner用LambdaMetafactory实现快速访问,需满足以下条件:
- 变量必须是原始规划变量,不能是影子变量。
- 变量对应的getter/setter严格遵循JavaBean规范:
- getter方法命名为
getXxx()(布尔类型允许isXxx()),无参数,返回值类型与变量类型一致。 - setter方法命名为
setXxx(),参数类型与getter返回类型匹配,返回值为void。
- getter方法命名为
- 实体类不能是final类:因为
LambdaMetafactory需要生成类的子类代理来实现方法调用,final类无法被继承。 - 使用支持
LambdaMetafactory的JDK版本:要求JDK 8及以上(OptaPlanner本身也要求JDK8+)。
内容的提问来源于stack exchange,提问作者marinier
相关产品推荐
相关产品推荐

