Tôi khá già Tôi đã ở đó và nhìn thấy nó và đập đầu tôi về nó nhiều lần.
Tôi đã có mặt tại một hội nghị ở Công viên Hursley nơi các chàng trai IBM đang nói với chúng tôi rằng ngôn ngữ Java hoàn toàn mới này tuyệt vời như thế nào, chỉ có ai đó hỏi ... tại sao không có kẻ hủy diệt cho các đối tượng này. Anh ta không có nghĩa là thứ mà chúng ta biết là kẻ hủy diệt trong C ++, nhưng cũng không có người quyết định (hoặc nó có người hoàn thiện nhưng về cơ bản họ không hoạt động). Đây là cách quay trở lại và chúng tôi quyết định Java là một chút ngôn ngữ đồ chơi vào thời điểm đó.
bây giờ họ đã thêm Người quyết định vào đặc tả ngôn ngữ và Java đã thấy một số thông qua.
Tất nhiên, sau đó mọi người được khuyên không nên đưa những người vào chung kết vào đối tượng của họ vì điều đó làm chậm quá trình GC xuống rất nhiều. (vì nó không chỉ khóa heap mà còn di chuyển các đối tượng sắp hoàn thành sang khu vực tạm thời, vì các phương thức này không thể được gọi vì GC đã tạm dừng ứng dụng chạy. Thay vào đó, chúng sẽ được gọi ngay trước khi tiếp theo Chu trình GC) (và tệ hơn, đôi khi trình hoàn thiện sẽ không bao giờ được gọi khi ứng dụng ngừng hoạt động. Hãy tưởng tượng không có tệp xử lý của bạn đóng, bao giờ)
Sau đó, chúng tôi đã có C #, và tôi nhớ diễn đàn thảo luận về MSDN nơi chúng tôi được cho biết ngôn ngữ C # mới này tuyệt vời như thế nào. Có người hỏi tại sao không có quyết toán quyết định và các chàng trai MS nói với chúng tôi rằng chúng tôi không cần những thứ như thế nào, sau đó nói với chúng tôi rằng chúng tôi cần thay đổi cách thiết kế ứng dụng, sau đó cho chúng tôi biết GC tuyệt vời như thế nào và tất cả các ứng dụng cũ của chúng tôi như thế nào rác và không bao giờ làm việc vì tất cả các tài liệu tham khảo thông tư. Sau đó, họ trích dẫn để gây áp lực và nói với chúng tôi rằng họ đã thêm mẫu IDispose này vào thông số kỹ thuật mà chúng tôi có thể sử dụng. Tôi nghĩ rằng đó là khá nhiều trở lại để quản lý bộ nhớ thủ công cho chúng tôi trong các ứng dụng C # tại thời điểm đó.
Tất nhiên, các chàng trai MS sau đó phát hiện ra rằng tất cả những gì họ đã nói với chúng tôi là ... tốt, họ đã tạo ra IDispose nhiều hơn một chút so với chỉ một giao diện tiêu chuẩn và sau đó thêm vào câu lệnh sử dụng. W00t! Rốt cuộc, họ nhận ra rằng quyết toán cuối cùng là thứ gì đó còn thiếu từ ngôn ngữ. Tất nhiên, bạn vẫn phải nhớ đặt nó ở mọi nơi, vì vậy nó vẫn hơi thủ công, nhưng tốt hơn.
Vậy tại sao họ lại làm điều đó khi họ có thể có ngữ nghĩa sử dụng kiểu tự động được đặt trên mỗi khối phạm vi ngay từ đầu? Có lẽ là hiệu quả, nhưng tôi muốn nghĩ rằng họ chỉ không nhận ra. Giống như cuối cùng họ nhận ra bạn vẫn cần con trỏ thông minh trong .NET (google SafeHandle), họ nghĩ rằng GC thực sự sẽ giải quyết tất cả các vấn đề. Họ quên rằng một đối tượng không chỉ là bộ nhớ và mà GC được thiết kế chủ yếu để xử lý việc quản lý bộ nhớ. họ bị cuốn vào ý tưởng rằng GC sẽ xử lý việc này và quên rằng bạn đặt những thứ khác vào đó, một đối tượng không chỉ là một đốm bộ nhớ không thành vấn đề nếu bạn không xóa nó trong một thời gian.
Nhưng tôi cũng nghĩ rằng việc thiếu một phương thức hoàn thiện trong Java ban đầu có nhiều hơn một chút - rằng các đối tượng bạn tạo ra đều là về bộ nhớ và nếu bạn muốn xóa một cái gì đó khác (như tay cầm DB hoặc ổ cắm hoặc bất cứ thứ gì ) sau đó bạn đã được dự kiến sẽ làm điều đó bằng tay .
Hãy nhớ rằng Java được thiết kế cho các môi trường nhúng, nơi mọi người đã quen viết mã C với nhiều phân bổ thủ công, vì vậy việc không có tự động miễn phí không phải là vấn đề - họ chưa bao giờ làm điều đó trước đây, vậy tại sao bạn lại cần nó trong Java? Vấn đề không liên quan gì đến các chủ đề, hoặc stack / heap, có lẽ nó chỉ ở đó để phân bổ bộ nhớ (và do đó phân bổ lại) dễ dàng hơn một chút. Trong tất cả, câu lệnh try / cuối cùng có lẽ là một nơi tốt hơn để xử lý các tài nguyên không có bộ nhớ.
Vì vậy, IMHO, cách .NET đơn giản sao chép lỗ hổng lớn nhất của Java là điểm yếu lớn nhất của nó. .NET nên là một C ++ tốt hơn, không phải là một Java tốt hơn.