Карта хроники - значения полей меняются местами
Я создал интерфейс 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> map = ChronicleMap
.of(LongValue.class, 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,
напечатанные значения ввода всегда были действительны.
Я не смог найти точного объяснения этому в документах Хроник. Все подсказки были связаны с размером значений (например, averageValueSize(), constantKeySizeBySample() и т. Д.), А не с именованием методов в интерфейсах значений.
Я проверил это на разных версиях хроники-карты, даже на новейшей, доступной в репозитории maven, и у меня всегда, в конце концов, возникала проблема с перестановками мест.
1 ответ
Какую версию Java вы используете?
Способ размещения объекта предполагает, что методы заказа отображаются стабильно, однако JVM не гарантирует этого, и разные версии могут вести себя по-разному (возможно, от запуска к запуску)
Способ обойти это - запустить код один раз с
-DdumpCode=true
который покажет вам сгенерированный код, используемый на консоли (например, даже в модульном тесте). Вы можете скопировать этот код из консоли в свою базу кода и избежать любых шансов, что это изменится в будущем, однако, если вы измените интерфейс, вам нужно будет удалить этот код и повторить его.