package com.fasterxml.jackson.databind.deser.impl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import com.fasterxml.jackson.core.JsonLocation;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.ValueInstantiator;
import com.fasterxml.jackson.databind.deser.std.JsonLocationInstantiator;

Container for a set of ValueInstantiators used for certain critical JDK value types, either as performance optimization for initialization time observed by profiling, or due to difficulty in otherwise finding constructors.
Since:2.10
/** * Container for a set of {@link ValueInstantiator}s used for certain critical * JDK value types, either as performance optimization for initialization time observed * by profiling, or due to difficulty in otherwise finding constructors. * * @since 2.10 */
public abstract class JDKValueInstantiators { public static ValueInstantiator findStdValueInstantiator(DeserializationConfig config, Class<?> raw) { if (raw == JsonLocation.class) { return new JsonLocationInstantiator(); } // [databind#1868]: empty List/Set/Map // [databind#2416]: optimize commonly needed default creators if (Collection.class.isAssignableFrom(raw)) { if (raw == ArrayList.class) { return ArrayListInstantiator.INSTANCE; } if (Collections.EMPTY_SET.getClass() == raw) { return new ConstantValueInstantiator(Collections.EMPTY_SET); } if (Collections.EMPTY_LIST.getClass() == raw) { return new ConstantValueInstantiator(Collections.EMPTY_LIST); } } else if (Map.class.isAssignableFrom(raw)) { if (raw == LinkedHashMap.class) { return LinkedHashMapInstantiator.INSTANCE; } if (raw == HashMap.class) { return HashMapInstantiator.INSTANCE; } if (Collections.EMPTY_MAP.getClass() == raw) { return new ConstantValueInstantiator(Collections.EMPTY_MAP); } } return null; } private static class ArrayListInstantiator extends ValueInstantiator.Base implements java.io.Serializable { private static final long serialVersionUID = 2L; public final static ArrayListInstantiator INSTANCE = new ArrayListInstantiator(); public ArrayListInstantiator() { super(ArrayList.class); } @Override public boolean canInstantiate() { return true; } @Override public boolean canCreateUsingDefault() { return true; } @Override public Object createUsingDefault(DeserializationContext ctxt) throws IOException { return new ArrayList<>(); } } private static class HashMapInstantiator extends ValueInstantiator.Base implements java.io.Serializable { private static final long serialVersionUID = 2L; public final static HashMapInstantiator INSTANCE = new HashMapInstantiator(); public HashMapInstantiator() { super(HashMap.class); } @Override public boolean canInstantiate() { return true; } @Override public boolean canCreateUsingDefault() { return true; } @Override public Object createUsingDefault(DeserializationContext ctxt) throws IOException { return new HashMap<>(); } } private static class LinkedHashMapInstantiator extends ValueInstantiator.Base implements java.io.Serializable { private static final long serialVersionUID = 2L; public final static LinkedHashMapInstantiator INSTANCE = new LinkedHashMapInstantiator(); public LinkedHashMapInstantiator() { super(LinkedHashMap.class); } @Override public boolean canInstantiate() { return true; } @Override public boolean canCreateUsingDefault() { return true; } @Override public Object createUsingDefault(DeserializationContext ctxt) throws IOException { return new LinkedHashMap<>(); } } private static class ConstantValueInstantiator extends ValueInstantiator.Base implements java.io.Serializable { private static final long serialVersionUID = 2L; protected final Object _value; public ConstantValueInstantiator(Object value) { super(value.getClass()); _value = value; } @Override // yes, since default ctor works public boolean canInstantiate() { return true; } @Override public boolean canCreateUsingDefault() { return true; } @Override public Object createUsingDefault(DeserializationContext ctxt) throws IOException { return _value; } } }