Незмінний об'єкт

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Незмі́нний об'є́кт — в об'єктно-орієнтованому програмуванні, об'єкт, стан якого не може бути змінено після створення. На противагу незмінним, стан змінних об'єктів може змінюватись після створення. Об'єкт може бути як незмінним повністю, так і певні його атрибути можуть бути задекларовані незмінними, використовуючи, наприклад, декларацію const мови програмування C++. У деяких випадках, об'єкт вважається незмінним навіть тоді, коли змінюються деякі його внутрішні атрибути, за умови, що зовні його стан виглядає незмінним. Наприклад, об'єкт, який використовує запам'ятовування результатів проміжних обчислень для кешування результатів складних обчислень, може вважатись незмінним. Початковий стан незмінного об'єкта, як правило, визначається під час створення об'єкта, але, він може, також, визначатись безпосередньо перед використанням об'єкта.

Часто, незмінні об'єкти можуть бути корисними через те, що вони дозволяють уникнути деяких дорогих операцій копіювання та порівняння, полегшуючи, в такий спосіб, вихідний код програми, та прискорюючи її роботу. Однак, у деяких випадках, незмінність об'єкта може заважати, наприклад, якщо об'єкт містить велику кількість змінних даних. Через це, багато мов програмування мають можливості роботи як із змінними, так і з незмінними об'єктами.

Незмінні об'єкти часто бувають корисними завдяки тому, що вони по суті потоко-безпечні.[1] Інша перевага в тому, що вони є простішими для розуміння і пропонують більш високий рівень безпеки, ніж змінювані об'єкти.[1]

Реалізація[ред.ред. код]

Незмінність об'єкту не означає, що фізична пам'ять в якій зберігається об'єкт не має доступу для запису. Скоріше, властивість бути незмінним йому задається під час компіляції у вигляді конструкції, яка вказує програмісту що можна робити з об'єктом через його інтерфейс, не зважаючи на те, що в абсолютній ситуації він може змінити його (наприклад, в обхід системи типів або порушуючи константність в C або C++).

C++[ред.ред. код]

В C++, реалізація константності класу Cart дозволено створювати нові екземпляри класу незмінними, з використанням ключового слова const (незмінний) або змінним, за бажанням, забезпечуючи дві різні версії методу getItems(). (Відмітимо, що в C++ це не обов'язково — і фактично не можливо — створити спеціалізований конструктор для незмінних екземплярів const.)

template<typename T>
class Cart {
  private:
   std::vector<T> items;

  public:
   Cart(const std::vector<T>& v): items(v) { }

   std::vector<T>& getItems() { return items; }
   const std::vector<T>& getItems() const { return items; }
   int total() const { /* повертає суму */ }
 };

Якби в класі було поле, яке є вказівником чи посиланням на інший об'єкт, то все одно можливо змінювати об'єкт, на який посилається такий вказівник або посилання в константному методі, без помилки порушення константності. Можна стверджувати, що об'єкт в такому випадку не є цілком незмінним. C++ також забезпечує абстрактну незмінність (на відміну від незмінності даних) за допомогою ключового слова mutable, що дозволяє змінювати змінну член класу в середині методу, що оголошений як const.

template<typename T>
class Cart {
  private:
   std::vector<T> items;
   mutable int    costInCents;
   mutable bool   totaled;

  public:
   Cart(const std::vector<T>& v): items(v), totaled(false) { }

   const std::vector<T>& getItems() const { return items; }
   int total() const {
      if (!totaled) {
         costInCents = 0;
         for (std::vector<T>::const_iterator itor = items.begin(); itor != items.end(); ++itor)
            costInCents += itor->costInCents();

         totaled = true;
      }
      return costInCents;
   }
 };

Примітки[ред.ред. код]

  1. а б Goetz et al. Java Concurrency in Practice. Addison Wesley Professional, 2006, Section 3.4. Immutability

Див. також[ред.ред. код]


Комп'ютер Це незавершена стаття про комп'ютери.
Ви можете допомогти проекту, виправивши або дописавши її.