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

## Interface SolutionCloner<Solution_>

- Type Parameters:
    `Solution_` - the solution type, the class with the `PlanningSolution` annotation
  All Known Subinterfaces:
    `PlanningSolution.NullSolutionCloner`
  All Known Implementing Classes:
    `FieldAccessingSolutionCloner`

      public interface SolutionCloner<Solution_>

  Clones a `PlanningSolution` during planning. Used to remember the state of a good `PlanningSolution` so it can be recalled at a later time when the original `PlanningSolution` is already modified. Also used in population based heuristics to increase or repopulate the population.

  Planning cloning is hard: avoid doing it yourself.

  An implementing class must be thread-safe after initialization.

- - ### Method Summary

    All Methods Instance Methods Abstract Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `Solution_` | `cloneSolution​(Solution_ original)` | Does a planning clone.

- - ### Method Detail

    - #### cloneSolution

          Solution_ cloneSolution​(Solution_ original)

      Does a planning clone. The returned `PlanningSolution` clone must fulfill these requirements:
      - The clone must represent the same planning problem. Usually it reuses the same instances of the problem facts and problem fact collections as the `original`.
      - The clone must have the same (equal) score as the `original`.
      - The clone must use different, cloned instances of the entities and entity collections. If a cloned entity changes, the original must remain unchanged. If an entity is added or removed in a cloned `PlanningSolution`, the original `PlanningSolution` must remain unchanged.
      Note that a class might support more than 1 clone method: planning clone is just one of them.

      This method is thread-safe.

      Parameters:
        `original` - never null, the original `PlanningSolution`
      Returns:
        never null, the cloned `PlanningSolution`