微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

编年史地图 - 字段的值正在交换位置

如何解决编年史地图 - 字段的值正在交换位置

我已经创建了 Value 接口:

public interface SomeVal {
    void setLevel1Description(@MaxUtf8Length(100) CharSequence level1Description);

    CharSequence getLevel1Description();

    void setLevel2Description(@MaxUtf8Length(100) CharSequence level2Description);

    CharSequence getLevel2Description();

    void setLevel3Description(@MaxUtf8Length(100) CharSequence level3Description);

    CharSequence getLevel3Description();
}

然后我创建了编年史地图、条目的键、条目的值,然后将此条目放入创建的地图中:

ChronicleMap<LongValue,SomeVal> map = ChronicleMap
                .of(LongValue.class,SomeVal.class)
                .createPersistedTo(new File('cache'));

key = Values.newHeapInstance(LongValue.class);
key.setValue(1);

val = Values.newHeapInstance(SomeVal.class);
val.setLevel1Description("level 1 Desc");
val.setLevel2Description("level 2 Desc");
val.setLevel3Description("level 3 Desc");

map.put(key,val);

然后我触发了几次附加到创建的地图的过程,获取价值并打印它:

//process starts (...) 
ChronicleMap<LongValue,SomeVal.class)
                .createPersistedTo(new File('cache'));

SomeVal result = map.get(key);
System.out.println(result);
//(...) process ends

对于某些运行,打印的条目具有正确的状态。 但有几次我得到了:

SomeVal{ level3Description=level 3 Desc,level1Description=level 2 Desc,level2Description=level 1 Desc }

level1Description 和 level2Description 的值交换了位置。

当我改名时:
level1Description -> l1Description
level2Description -> l2Description
level3Description -> l3Description
条目的打印值始终有效。
我在 Chronicle 文档中找不到对此的确切解释。所有提示都与值的大小有关(例如:averageValueSize()、constantKeySizeBySample() 等),而不是 Value 接口中的方法命名。
我在不同版本的编年史地图上检查了这一点,即使是在 Maven 存储库中可用的最新版本上,我总是在交换位置时遇到这个问题。

解决方法

您使用的是哪个版本的 Java?

对象的布局方式假设 order 方法出现是稳定的,但是 JVM 不能保证这样做,并且不同的版本可能会有不同的行为(可能从运行到运行)

解决这个问题的方法是使用 -DdumpCode=true 运行一次代码,它将向您显示在控制台上使用的生成代码(例如,即使在单元测试中)。您可以将此代码从控制台复制到您的代码库中,以避免将来发生任何变化,但是如果您更改界面,则需要删除此代码并重复。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。