---
title: "Замена ссылки значением"
type: "refactoring-technique"
slug: "change-reference-to-value"
url: "http://localhost:3000/ru/change-reference-to-value.md"
category: "Организация данных"
description: "Проблема: У вас есть объект-ссылка, который слишком маленький и неизменяемый, чтобы оправдать сложности по управлению его жизненным циклом. Решение: Превратите его в объект-значение."
---
# Замена ссылки значением

> Проблема: У вас есть объект-ссылка, который слишком маленький и неизменяемый, чтобы оправдать сложности по управлению его жизненным циклом. Решение: Превратите его в объект-значение.

## Problem

У вас есть объект-ссылка, который слишком маленький и неизменяемый, чтобы оправдать сложности по управлению его жизненным циклом.

## Solution

Превратите его в объект-значение.

## Why Refactor

Побудить к переходу от ссылки к значению могут возникшие при работе с объектом-ссылкой неудобства.

Объектами-ссылками необходимо некоторым образом управлять:

* всегда приходится запрашивать у объекта-хранилища нужный объект;
* ссылки в памяти тоже могут оказаться неудобными в работе;
* работать с объектами-ссылками, в отличие от объектов-значений, особенно сложно в распределённых и параллельных системах.

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

## Benefits

* Важное свойство объектов-значений заключается в том, что они должны быть неизменяемыми. При каждом запросе, возвращающем значение одного из них, должен получаться одинаковый результат. Если это так, то не возникает проблем при наличии многих объектов, представляющих одну и ту же вещь.
* Объекты-значения гораздо проще в реализации.

## How to Refactor

1. Обеспечьте неизменяемость объекта. Объект не должен иметь сеттеров или других методов, меняющих его состояние и данные (в этом может помочь [удаление сеттера](/ru/remove-setting-method)). Единственное место, где полям объекта-значения присваиваются какие-то данные, должен быть конструктор.
2. Создайте метод сравнения для того, чтобы иметь возможность сравнить два объекта-значения.
3. Проверьте, возможно ли удалить фабричный метод и сделать конструктор объекта публичным.
## Relations

**Opposite refactorings**

- [Замена значения ссылкой](/ru/change-value-to-reference.md)

