Глубокая копия без клонирования и сериализации - PullRequest
0 голосов
/ 15 марта 2019

У меня может быть глупый вопрос, но я все еще хочу его задать.

Что у меня есть:

1. У меня есть файл схемы yml, который описывает структуру объектов. На основе этого файла я генерирую некоторые объекты (например, Car).

Пример Yml:

swagger: '2.0'
info:
  description: Reference type definitions
  version: '1.0'
  title: Reference type definitions
paths: {}
definitions:

  Car:
    type: object
    properties:
      id:
        type: string
      someField:
        type: string
      someArray:
        type: array
        items:
          $ref: '#/definitions/Items'

2. Используя чванство, я генерирую простые объекты (может быть jaxb или что-то еще)

Пример сгенерированного файла:

@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaClientCodegen", date = "2019-03-13T18:18:47.890+02:00")
public class Car {
  @SerializedName("id")
  private String id = null;

  @SerializedName("someField")
  private String someField= null;

  @SerializedName("someArray")
  private List<Items> someArray= null;

Пример values.yml

someField: YellowCar
someArray:
-
  id: itemID1
  itemField: value
-
  id: itemID2
  itemField: value2

3. После этого я читаю values.yml и использую сопоставление объектов Джексона, только что перечитал values.yml в сгенерированный объект Car, что дает мне экземпляр этого сгенерированного объекта со всеми сопоставленными значениями.

4. На этом этапе у меня есть объект в некотором локальном кэше, и у меня есть список таких объектов, пример:

Map<String, Car> carReferenceCache; // Represents map of values.yml ID to mapped object

Теперь я хочу просмотреть каждое значение Car и объединить объекты Car, включая все, что есть внутри (список, карты и т. Д.), И объединить Car. Когда я написал некоторую логику слияния, я понял, что на самом деле значение одного из «carReferenceCache» изменяется, это означает, что если кто-то получит автомобиль по идентификатору, он вернет измененный объект (объединенный), что в моем случае не годится. Я хочу сохранить в этом кеше изначально загруженные объекты с оригинальными данными.

Итак, мой вопрос: Как я могу сделать глубокое клонирование каждого объекта Car, когда кто-то вызывает getCarByID и возвращает эту копию без изменения объекта в самом кэше ???

Есть несколько ограничений: 1. Эти объекты были сгенерированы из файла схемы yml (он не реализует сериализуемые и клонируемые интерфейсы) 2. Я не могу изменить конструктор, классы генерируются из yml (используется swagger (возможно, не кричите))

...