Учитывая следующий (неудачный) тест JUnit для Jackson 2.9.5:
package de.azamir.test;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import org.junit.Test;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonFinalTest {
private static final class MyClass {
@JsonProperty("myProperty")
public final String myProperty = "myPropertyValueInit";
}
@Test
public void doTest() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, JsonParseException, JsonMappingException, IOException {
final MyClass deserializedMyClass1 = new ObjectMapper().readValue("{\"myProperty\":\"myPropertyValueDeserialized\"}", MyClass.class);
// "myPropertyValueInit"
final String directValue = deserializedMyClass1.myProperty;
// "myPropertyValueDeserialized"
final String reflectValue = (String) MyClass.class.getDeclaredField("myProperty").get(deserializedMyClass1);
assertEquals(directValue, reflectValue);
}
}
Я подозреваю, что виртуальная машина Java оптимизирует доступ к конечным полям, так что значение, записанное Джексоном (через отражение) может быть восстановлен только через отражение. Это только сегодня привело к очень тонкой и трудной для поиска ошибке в нашей кодовой базе.
Является ли эта проблема, которая так или иначе решалась Джексоном? Мне кажется, что у кода Джексона нет способа «увидеть» это, но кто знает.
Я знаю, что есть несколько способов улучшить этот код, например, удалить
-
@JsonProperty
и отключение конечных полей как мутаторов - не инициализирует поле во время объявления, но в конструкторе
- не делает поля окончательными вообще
, но является Есть ли рекомендуемый способ убедиться, что ни один разработчик в нашей команде (кто может не знать об этом) делает это?