Я досить стара. Я був там і бачив це і багато разів бив головою про це.
Я був на конференції в парку Херслі, де хлопці IBM розповідали нам, наскільки чудовою була ця абсолютно нова мова Java, лише хтось запитав ... чому не існує деструктора для цих об’єктів. Він не мав на увазі те, що ми знаємо як деструктора в C ++, але не було і фіналізатора (або у нього були фіналізатори, але вони в основному не працювали). Це повернення назад, і ми вирішили, що Java в цій точці була трохи іграшковою мовою.
тепер вони додали Finalisers до мовної специфікації, і Java побачила деяке прийняття.
Звичайно, пізніше всім сказали не ставити фіналізаторів на свої об'єкти, оскільки це надзвичайно сповільнило ГК. (як це потрібно було не тільки заблокувати купу, але перемістити об'єкти, що підлягають завершенню, до тимчасової області, оскільки ці методи не можна було викликати, оскільки GC призупинила роботу програми. Замість цього вони будуть викликані безпосередньо перед наступним Цикл GC) (і ще гірше, іноді фіналізатор ніколи не зателефонував би, коли програма закривалася. Уявіть, ніколи не закриваєте обробку файлів)
Тоді у нас був C #, і я пам’ятаю дискусійний форум на MSDN, де нам сказали, наскільки чудова ця нова мова C #. Хтось запитав, чому немає детермінованої доопрацювання, і хлопці з MS розповіли нам, як нам такі речі не потрібні, потім сказали нам, що нам потрібно змінити спосіб розробки програм, потім сказали нам, наскільки дивовижним є GC та як усі наші старі програми сміття і ніколи не працювало через всі кругові посилання. Тоді вони піддалися тиску і сказали нам, що вони додали цю схему ідентифікації до специфікації, яку ми могли б використати. Я подумав, що в цей час ми повернулися до ручного управління пам'яттю в додатках C #.
Звичайно, пізніше хлопці з MS виявили, що все, що вони нам сказали, це ... ну, вони зробили IDispose трохи більше, ніж просто стандартний інтерфейс, а пізніше додали оператор use. W00t! Вони зрозуміли, що детермінованої доопрацювання все-таки щось не вистачає в мові. Звичайно, ви все ще повинні пам’ятати, щоб розмістити його скрізь, тому його все-таки трохи посібник, але це краще.
То чому вони зробили це, коли їм могло було використовувати семантику стилю автоматично, розміщену на кожному блоці області з самого початку? Можливо, ефективність, але мені подобається думати, що вони просто не усвідомлювали. Як і в кінцевому підсумку вони зрозуміли, що вам все ще потрібні розумні покажчики в .NET (google SafeHandle), вони думали, що GC дійсно вирішить усі проблеми. Вони забули, що об'єкт - це не просто пам'ять, а GC призначений насамперед для управління пам'яттю. вони захопилися думкою, що GC впорається з цим, і забули, що ти туди вкладаєш інші речі, об’єкт - це не просто плівка пам'яті, яка не має значення, якщо ти її не видалиш на деякий час.
Але я також думаю, що відсутність методу доопрацювання в оригінальній Java було трохи більше - це те, що створені вами об'єкти стосувалися пам’яті, і якщо ви хочете видалити щось інше (наприклад, обробку БД або сокет чи будь-що інше) ) тоді від вас очікували зробити це вручну .
Пам'ятайте, що Java була розроблена для вбудованих середовищ, де люди звикли писати код C з великою кількістю ручних виділень, тому не мати автоматичного безкоштовного не було великою проблемою - вони ніколи цього не робили, тому навіщо вам це потрібно на Java? Проблема не мала нічого спільного з потоками або стеком / купами, можливо, саме там було трохи полегшити розподіл пам’яті (і, отже, делокацію). Загалом, операція спробувати / нарешті, мабуть, є кращим місцем для обробки ресурсів, що не належать до пам'яті.
Отже, IMHO, спосіб .NET просто скопіював найбільший недолік Java - це її найбільша слабкість. .NET повинен був бути кращим C ++, а не кращою Java.