Drools 分数计算中的不同泛型类型
Different generic types in Drools score calculation
我正在开发一个程序来使用 Optaplanner 创建祭坛服务器时间表。
该域大部分源自护士排班示例。
服务器请求的问题事实很多,例如:
class DateOffRequest {
private Server server;
private LocalDate date;
}
和
class DayOffRequest {
private Server server;
private DayOfWeek day;
}
为了简化代码,我想将它们替换为 AbstractMap.SimpleImmutableEntry。
问题是不能像这样在 Drools 规则文件中指定泛型 class 的类型:
rule "dateOffRequest"
when
Map.Entry<Server,LocalDate>($server : server, $date : date)
...
它在不指定类型的情况下运行,但是 Drools 将使用各种规则的各种请求,因为他无法区分它们,这对我来说似乎不是很有效。
我想过将 Map.Entries 包装在单独的 classes 中并通过功能进行连接,但这会产生很多样板代码并消除使用泛型的优势。
如果可以指定规则要使用的问题事实集合,那就太棒了。我认为它类似于 ValueRangeProviders 指定 id 的方式,但我没有找到任何方法来实现这种行为。
有什么最佳实践来应对这种情况?
这是由于 Java 的 具体化 泛型造成的限制。这意味着如果 Map
实例在问题事实中,则无法检测用于构造该 Map
实例的通用类型。在运行时从 java 中的实例中删除通用类型。 (请注意,泛型类型不会在运行时从方法签名中删除,但这是另一种情况)。
解决方法:创建强类型组合 class,例如 ServerLocalDatePair
。
非常感谢您的回答!
我会按照你的建议去做的。
事实上,我找到了一种非常简洁的方法:
public class DateOffRequest extends AbstractMap.SimpleImmutableEntry<Server, LocalDate> {
public DateOffRequest(Server key, LocalDate value) {
super(key, value);
}
}
我正在开发一个程序来使用 Optaplanner 创建祭坛服务器时间表。 该域大部分源自护士排班示例。
服务器请求的问题事实很多,例如:
class DateOffRequest {
private Server server;
private LocalDate date;
}
和
class DayOffRequest {
private Server server;
private DayOfWeek day;
}
为了简化代码,我想将它们替换为 AbstractMap.SimpleImmutableEntry。
问题是不能像这样在 Drools 规则文件中指定泛型 class 的类型:
rule "dateOffRequest"
when
Map.Entry<Server,LocalDate>($server : server, $date : date)
...
它在不指定类型的情况下运行,但是 Drools 将使用各种规则的各种请求,因为他无法区分它们,这对我来说似乎不是很有效。
我想过将 Map.Entries 包装在单独的 classes 中并通过功能进行连接,但这会产生很多样板代码并消除使用泛型的优势。
如果可以指定规则要使用的问题事实集合,那就太棒了。我认为它类似于 ValueRangeProviders 指定 id 的方式,但我没有找到任何方法来实现这种行为。
有什么最佳实践来应对这种情况?
这是由于 Java 的 具体化 泛型造成的限制。这意味着如果 Map
实例在问题事实中,则无法检测用于构造该 Map
实例的通用类型。在运行时从 java 中的实例中删除通用类型。 (请注意,泛型类型不会在运行时从方法签名中删除,但这是另一种情况)。
解决方法:创建强类型组合 class,例如 ServerLocalDatePair
。
非常感谢您的回答!
我会按照你的建议去做的。 事实上,我找到了一种非常简洁的方法:
public class DateOffRequest extends AbstractMap.SimpleImmutableEntry<Server, LocalDate> {
public DateOffRequest(Server key, LocalDate value) {
super(key, value);
}
}