Package org.optaplanner.core.impl.domain.solution.cloner

## Class DeepCloningUtils

- java.lang.Object
- - org.optaplanner.core.impl.domain.solution.cloner.DeepCloningUtils

-     public final class DeepCloningUtils
      extends Object

- - ### Constructor Summary

    Constructors
    Constructor | Description
    --- | ---
    `DeepCloningUtils​(SolutionDescriptor<?> solutionDescriptor)` |

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `Set<Class<?>>` | `getDeepClonedClasses​(Collection<Class<?>> entitySubclasses)` |
    `boolean` | `getDeepCloneDecision​(Field field, Class<?> owningClass, Class<?> actualValueClass)` | Gets the deep cloning decision for a particular value assigned to a field, memoizing the result.
    `Set<Class<?>>` | `getDeepClonedTypeArguments​(Type genericType)` |
    `boolean` | `isClassDeepCloned​(Class<?> type)` |
    `boolean` | `isFieldADeepCloneProperty​(Field field, Class<?> owningClass)` |
    `boolean` | `isFieldAnEntityOrSolution​(Field field)` | Returns true iff a field represent an Entity/Solution or a collection of Entity/Solution.
    `boolean` | `isFieldAnEntityPropertyOnSolution​(Field field, Class<?> owningClass)` | Return true only if a field represent an entity property on the solution class.
    `boolean` | `isFieldDeepCloned​(Field field, Class<?> owningClass)` | Gets the deep cloning decision for a field.
    `boolean` | `isTypeArgumentDeepCloned​(Type genericType)` |
    `boolean` | `retrieveDeepCloneDecisionForActualValueClass​(Class<?> actualValueClass)` | This method is thread-safe.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### DeepCloningUtils

          public DeepCloningUtils​(SolutionDescriptor<?> solutionDescriptor)

  - ### Method Detail

    - #### getDeepCloneDecision

          public boolean getDeepCloneDecision​(Field field,
                                              Class<?> owningClass,
                                              Class<?> actualValueClass)

      Gets the deep cloning decision for a particular value assigned to a field, memoizing the result.
      Parameters:
        `field` - the field to get the deep cloning decision of
        `owningClass` - the class that owns the field; can be different from the field's declaring class (ex: subclass)
        `actualValueClass` - the class of the value that is currently assigned to the field; can be different from the field type (ex: for the field "List myList", the actual value class might be ArrayList).
      Returns:
        true iff the field should be deep cloned with a particular value.

    - #### retrieveDeepCloneDecisionForActualValueClass

          public boolean retrieveDeepCloneDecisionForActualValueClass​(Class<?> actualValueClass)

      This method is thread-safe.
      Parameters:
        `actualValueClass` - never null
      Returns:
        never null

    - #### isFieldDeepCloned

          public boolean isFieldDeepCloned​(Field field,
                                           Class<?> owningClass)

      Gets the deep cloning decision for a field.
      Parameters:
        `field` - The field to get the deep cloning decision of
        `owningClass` - The class that owns the field; can be different from the field's declaring class (ex: subclass).
      Returns:
        True iff the field should always be deep cloned (regardless of value).

    - #### isFieldAnEntityPropertyOnSolution

          public boolean isFieldAnEntityPropertyOnSolution​(Field field,
                                                           Class<?> owningClass)

      Return true only if a field represent an entity property on the solution class. An entity property is one who type is a PlanningEntity or a collection of PlanningEntity.
      Parameters:
        `field` - The field to get the deep cloning decision of
        `owningClass` - The class that owns the field; can be different from the field's declaring class (ex: subclass).
      Returns:
        True only if the field is an entity property on the solution class. May return false if the field getter/setter is complex.

    - #### isFieldAnEntityOrSolution

          public boolean isFieldAnEntityOrSolution​(Field field)

      Returns true iff a field represent an Entity/Solution or a collection of Entity/Solution.
      Parameters:
        `field` - The field to get the deep cloning decision of
      Returns:
        True only if the field represents or contains a PlanningEntity or PlanningSolution

    - #### isClassDeepCloned

          public boolean isClassDeepCloned​(Class<?> type)

    - #### isTypeArgumentDeepCloned

          public boolean isTypeArgumentDeepCloned​(Type genericType)

    - #### isFieldADeepCloneProperty

          public boolean isFieldADeepCloneProperty​(Field field,
                                                   Class<?> owningClass)

    - #### getDeepClonedTypeArguments

          public Set<Class<?>> getDeepClonedTypeArguments​(Type genericType)

      Returns:
        never null

    - #### getDeepClonedClasses

          public Set<Class<?>> getDeepClonedClasses​(Collection<Class<?>> entitySubclasses)