Как предотвратить нежелательное обновление сохраненных объектов? - PullRequest
0 голосов
/ 02 сентября 2011

У меня есть класс Load и класс Cargo. Экземпляр Load содержит экземпляр Cargo.

class Load {
    Cargo cargo
}

class Cargo {
    String name
    BigDecimal cost
}

Допустим, что name экземпляра Cargo - это "камень", а cost - это "11.11". Теперь я использую этот экземпляр Cargo для создания экземпляра Load. Теперь, когда экземпляр Load создан, я не хочу, чтобы его "груз" менялся. Например, если я изменю цену на «камень» на «22,22», я не хочу, чтобы цена «груза» в моем экземпляре Load изменилась. Каков оптимальный способ справиться с такой ситуацией?

1 Ответ

1 голос
/ 02 сентября 2011

Что ж, если у вас может быть только один Cargo на Load (в соответствии с вашим примером), вы захотите добавить свойство cost к Load .Затем вам нужно будет скопировать стоимость во время создания объектов.Вы можете сделать это с помощью перегруженного метода в объекте Load или просто написать свой собственный метод для добавления Cargo к Load .

Если вам действительно нужно несколько грузов на нагрузку , то вам понадобится промежуточный объект для представления соединения.Этот объект будет хранить цену в то время, когда они были связаны.Это может выглядеть так:

class Load {
    LoadCargo loadCargo
}
class LoadCargo {
    Cargo cargo
    BigDecimal cost
}
class Cargo {
    String name
    BigDecimal cost
}

Конечно, ваша объектная модель будет немного сложнее из-за косвенной связи с Cargo.

Редактировать Другой способЧтобы справиться с множественной ситуацией, нужно дублировать Cargo каждый раз, когда стоимость обновляется.Это может быть более эффективным, если вы ожидаете, что cost будет в основном статическим.Я бы справился с этим, добавив поле для «отключения» элементов, например:

class Cargo {
    String name
    BigDecimal cost
    boolean active = true
}

Я полагаю, вы можете просто клонировать груз при обновлении следующим образом:

oldCargo = Cargo.get(params.id)
newCargo = new Cargo()
newCargo.properties = oldCargo.properties
// now set the new cost, etc.
newCargo.save()
oldCargo.active = false
oldCargo.save()

просто предположение, вероятно, он сломан.

...