Чи існує ситуація, коли краще використовувати слабкі посилання замість простого складу?


10

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

Використання WeakHashMap для додавання об'єкту якихось властивостей або збереження звуків метаданих для мене, як довільне рішення, засноване на волі просто використовувати прокляту річ. Іншими словами - погана конструкція . Я розумію, що існують ситуації, коли успадкування може бути недоступним (підсумкові класи, інтерфейси), але як бути зі складом? Я не можу придумати жодного прикладу, коли композиція не була б варіантом. І, звичайно, кращий, тому що він спирається на усталений принцип, а не на "мовну вигадку".

Отже, чи існує ситуація, коли було б краще використовувати слабкі посилання замість простого складу? Якщо ні, то чому всі в Інтернеті, здається, помиляються?


Логічна помилка: "... довільне рішення, засноване на волі просто використовувати прокляту річ. Іншими словами - погана конструкція." Кінці можуть не виправдовувати засоби, але засобів недостатньо для протиріччя кінців. Враховуючи ті ж методи, результат може гіпотетично стати хорошим дизайном. Хоча для цього я б не заперечував. :)
cwharris

3
Слабкі посилання є ортогональною концепцією композиції та успадкування.
Роберт Харві

Відповіді:


13

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

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

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

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

Метадані, які накопичуються і ніколи не вивільняються, навіть коли об'єкт даних більше не використовується, є витоком пам'яті.

Слабка хешмак, що посилається, вирішує обидві проблеми. Це дозволяє розташовувати метадані за даними і дозволяє звільняти метадані через деякий час після звільнення даних.

Далі зауважимо, що слабке посилання на хешмак дозволяє відновлювати не тільки (метадані) значення (gc'ed), а й ключі (data), які потрібно відшкодувати (gc'ed), оскільки якби ключі зберігалися, це також було б витоку пам'яті, і далі, значення також ніколи не можна було випустити.


Чому не використовуються об'єкти даних із таблицею метаданих, захищених слабким хешмапом, не враховуються як композиція?
Джек

2
@Jack, Склад, особливо "проста композиція" на мою думку, принаймні, - це об'єкти, що посилаються на інші об'єкти, але прямо так. Співвідношення композиції "має-а" виражається за допомогою простого посилання, а іноді і колекції. Тут хешмап - це непрямий метод. Ви не можете дійти до прикраси, якщо у вас немає хешмапу. В той час як у складі ви можете зробити цю навігацію. Таким чином, я віддаю перевагу називати ці метадані прикрасою, а не композицією, але вони, безумовно, пов'язані між собою. FWIW, прикраса (IMHO) складається з даними, тільки не навпаки.
Ерік Ейдт

@Jack, повторно: мій останній FWIW, я просто зрозумів, що, використовуючи слабкий хешмап, ти зазвичай не посилаєш посилання з метаданих, що прикрашають об'єкт, на інший через збереження пам’яті (або, якщо ти хотів, щоб у ньому був хедж-а напрямок, це мало б бути слабким орієнтиром). Отже, зазвичай клієнт слабкого хешмапу працює з двома об'єктами, які ефективно з'єднані один з одним, але технічно не знаходяться в об'єктній композиції один з одним.
Ерік Ейдт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.