【发布时间】:2020-02-26 15:48:22
【问题描述】:
我有一个类节点,它有设备列表。例如
class Node {
String nodeCode;
String name;
List devices;
}
class Device {
String deviceCode;
String name;
}
我正在使用 LEVENSHTEIN_DISTANCE 算法比较两个 Node 对象,下面提到了场景:
Senario - 1. 移除 device1:
Old Version:
var device1 = Device("d1", "device1")
var device2 = Device("d2", "device2")
var devices = mutableListOf<Device>()
devices.add(device1)
devices.add(device2)
val before = Node("n1", "node1", devices) // Old Version
Current Version:
var newDevice1 = Device("d1", "device1")
var newDevices = mutableListOf<Device>()
newDevices.add(newDevice1)
var after = Node("n1", "node1", newDevices) // New Version
Compare both version:
var diff = javers.compare(before, after)
println("$diff")
Output:
changes on com.example.audit.Node/ :
'devices' collection changes :
1. 'com.example.audit.Node/#devices/1' removed
Senario - 2. 添加设备 2:
Old Version:
var newDevice1 = Device("d1", "device1")
var newDevices = mutableListOf<Device>()
newDevices.add(newDevice1)
var after = Node("n1", "node1", newDevices) // Old Version
Current Version:
var device1 = Device("d1", "device1")
var device2 = Device("d2", "device2")
var devices = mutableListOf<Device>()
devices.add(device1)
devices.add(device2)
val after1 = Node("n1", "node1", devices) // New Version
Compare both version:
var diff = javers.compare(after, after1)
Output:
changes on com.example.audit.Node/ :
'devices' collection changes :
1. 'com.example.audit.Node/#devices/1' added
Senario - 3. 从设备列表中的位置 0 移除 device1:
Old Version:
var device1 = Device("d1", "device1")
var device2 = Device("d2", "device2")
var devices = mutableListOf<Device>()
devices.add(device1)
devices.add(device2)
val after1 = Node("n1", "node1", devices) //Old Version
Current Version:
device2 = Device("d2", "device2")
var newDevices2 = mutableListOf<Device>()
newDevices2.add(device2)
val after2 = Node("n1", "node1", newDevices2) // New Version
Compare both version:
diff = javers.compare(after1, after2)
Output:
changes on com.example.audit.Node/ :
'devices' collection changes :
1. 'com.example.audit.Node/#devices/1' removed
第三种情况给出了错误的输出。我从列表中的第 0 位删除了 device1,但它从设备列表中的第 1 位中删除了。
我想要第 3 个场景输出,例如:
changes on com.example.audit.Node/ :
'devices' collection changes :
0. 'com.example.audit.Node/#devices/0' removed
JaVers 对自定义对象列表有限制吗?
我错过了原型中的第 3 个场景。我去了并集成到我的项目中,并且更改已移至阶段。这是阻止我发布。
您能否提供您的意见,我必须做出哪些改变才能获得预期的结果?
【问题讨论】:
-
为什么要使用非参数化列表?自 Java 7 以来,这是一种不好的做法,这对 Javers 绝对不利。 Javers 不会猜测
List devices是一个设备列表,而只是将其视为一个对象列表 -
LEVENSHTEIN_DISTANCE 算法不应考虑索引。但如果您看到我上面提到的第 3 个场景输出,它仍然在考虑索引。
-
我只是举了个例子,但我在我的课堂上使用 List
-
推送一个可运行的测试用例,比如github.com/javers/javers/tree/master/javers-core/src/test/…
-
这是我的程序 - github.com/shivusajjan/javers-example/blob/master/src/test/java/… - @BartekWalacik
标签: spring-boot kotlin javers