Class Data
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final BigDecimalThe single instance of the magic null object for aBigDecimal.static final BigIntegerThe single instance of the magic null object for aBigInteger.static final BooleanThe single instance of the magic null object for aBoolean.static final ByteThe single instance of the magic null object for aByte.private static final ConcurrentHashMap<Class<?>, Object> Cache of the magic null object for the given Java class.static final CharacterThe single instance of the magic null object for aCharacter.static final DateTimeThe single instance of the magic null object for aDateTime.static final DoubleThe single instance of the magic null object for aDouble.static final FloatThe single instance of the magic null object for aFloat.static final IntegerThe single instance of the magic null object for aInteger.static final LongThe single instance of the magic null object for aLong.static final ShortThe single instance of the magic null object for aShort.static final StringThe single instance of the magic null object for aString. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic <T> Tclone(T data) Returns a deep clone of the given key/value data, such that the result is a completely independent copy.private static ObjectcreateNullInstance(Class<?> objClass) static voidMakes a deep copy of the given source object into the destination object that is assumed to be constructed usingObject.clone().static booleanReturns whether the given object is the magic object that represents the null value of its class.static booleanisPrimitive(Type type) Returns whether the given type is one of the supported primitive classes like number and date/time, or is a wildcard of one.static booleanisValueOfPrimitiveType(Object fieldValue) Returns whether to given value isnullor its class is primitive as defined byisPrimitive(Type).Returns the map to use for the given data that is treated as a map from string key to some value.static Collection<Object> newCollectionInstance(Type type) Returns a new collection instance for the given type.newMapInstance(Class<?> mapClass) Returns a new instance of a map based on the given field class.static <T> TReturns the single instance of the magic object that represents the "null" value for the given Java class (including array or enum).static ObjectparsePrimitiveValue(Type type, String stringValue) Parses the given string value based on the given primitive type.static TyperesolveWildcardTypeOrTypeVariable(List<Type> context, Type type) Aggressively resolves the given type in such a way that the resolved type is not a wildcard type or a type variable, returningObject.classif the type variable cannot be resolved.
-
Field Details
-
NULL_BOOLEAN
-
NULL_STRING
-
NULL_CHARACTER
-
NULL_BYTE
-
NULL_SHORT
-
NULL_INTEGER
-
NULL_FLOAT
-
NULL_LONG
-
NULL_DOUBLE
-
NULL_BIG_INTEGER
The single instance of the magic null object for aBigInteger. -
NULL_BIG_DECIMAL
The single instance of the magic null object for aBigDecimal. -
NULL_DATE_TIME
-
NULL_CACHE
Cache of the magic null object for the given Java class.
-
-
Constructor Details
-
Data
public Data()
-
-
Method Details
-
nullOf
Returns the single instance of the magic object that represents the "null" value for the given Java class (including array or enum).- Parameters:
objClass- class of the object needed- Returns:
- magic object instance that represents the "null" value (not Java
null) - Throws:
IllegalArgumentException- if unable to create a new instance
-
createNullInstance
-
isNull
Returns whether the given object is the magic object that represents the null value of its class.- Parameters:
object- object ornull- Returns:
- whether it is the magic null value or
falsefornullinput
-
mapOf
Returns the map to use for the given data that is treated as a map from string key to some value.If the input is
null, it returns an empty map. If the input is a map, it simply returns the input. Otherwise, it will create a map view using reflection that is backed by the object, so that any changes to the map will be reflected on the object. The map keys of that map view are based on theKeyannotation, and null is not a possible map value, although the magic null instance is possible (seenullOf(Class)andisNull(Object)). Iteration order of the data keys is based on the sorted (ascending) key names of the declared fields. Note that since the map view is backed by the object, and that the object may change, many methods in the map view must recompute the field values using reflection, for exampleMap.size()must check the number of non-null fields.- Parameters:
data- any key value data, represented by an object or a map, ornull- Returns:
- key/value map to use
-
clone
public static <T> T clone(T data) Returns a deep clone of the given key/value data, such that the result is a completely independent copy.This should not be used directly in the implementation of
Object.clone(). Instead usedeepCopy(Object, Object)for that purpose.Final fields cannot be changed and therefore their value won't be copied.
- Parameters:
data- key/value data object or map to clone ornullfor anullreturn value- Returns:
- deep clone or
nullfornullinput
-
deepCopy
Makes a deep copy of the given source object into the destination object that is assumed to be constructed usingObject.clone().Example usage of this method in
Object.clone():@Override public MyObject clone() { try { @SuppressWarnings("unchecked") MyObject result = (MyObject) super.clone(); Data.deepCopy(this, result); return result; } catch (CloneNotSupportedException e) { throw new IllegalStateException(e); } }Final fields cannot be changed and therefore their value won't be copied.
- Parameters:
src- source objectdest- destination object of identical type as source object, and any contained arrays must be the same length
-
isPrimitive
Returns whether the given type is one of the supported primitive classes like number and date/time, or is a wildcard of one.A primitive class is any class for whom
Class.isPrimitive()is true, as well as any classes of type:Character,String,Integer,Long,Short,Byte,Float,Double,BigInteger,BigDecimal,Boolean, andDateTime.- Parameters:
type- type ornullforfalseresult- Returns:
- whether it is a primitive
-
isValueOfPrimitiveType
Returns whether to given value isnullor its class is primitive as defined byisPrimitive(Type). -
parsePrimitiveValue
Parses the given string value based on the given primitive type.Types are parsed as follows:
Void: nullnullor is assignable fromString(likeObject): no parsingcharorCharacter:String.charAt(0) (requires length to be exactly 1)booleanorBoolean:Boolean.valueOf(String)byteorByte:Byte.valueOf(String)shortorShort:Short.valueOf(String)intorInteger:Integer.valueOf(String)longorLong:Long.valueOf(String)floatorFloat:Float.valueOf(String)doubleorDouble:Double.valueOf(String)BigInteger:BigInteger(String)BigDecimal:BigDecimal(String)DateTime:DateTime.parseRfc3339(String)
Note that this may not be the right behavior for some use cases.
- Parameters:
type- primitive type ornullto parse as a stringstringValue- string value to parse ornullfornullresult- Returns:
- parsed object or
nullfornullinput - Throws:
IllegalArgumentException- if the given class is not a primitive class
-
newCollectionInstance
Returns a new collection instance for the given type.Creates a new collection instance specified for the first input collection class that matches as follows:
nullor an array or assignable fromArrayList(likeListorCollectionorObject): returns anArrayList- assignable from
HashSet: returns aHashSet - assignable from
TreeSet: returns aTreeSet - else: calls
Types.newInstance(Class)
- Parameters:
type- type ornullforArrayList.- Returns:
- new collection instance
- Throws:
ClassCastException- if result is does not extendCollection
-
newMapInstance
Returns a new instance of a map based on the given field class.Creates a new map instance specified for the first input map class that matches as follows:
- Parameters:
mapClass- field class- Throws:
ClassCastException- if result is does not extendMap
-
resolveWildcardTypeOrTypeVariable
Aggressively resolves the given type in such a way that the resolved type is not a wildcard type or a type variable, returningObject.classif the type variable cannot be resolved.- Parameters:
context- context list, ordering from least specific to most specific type context, for example container class and then its fieldtype- type ornullfornullresult- Returns:
- resolved type (which may be class, parameterized type, or generic array type, but not
wildcard type or type variable) or
nullfornullinput
-