2009-03-26 26 views
5

Trong C++ chúng tôi có mẫu Mua lại tài nguyên là khởi tạo (RAII), giúp đơn giản hóa việc quản lý tài nguyên. Ý tưởng là cung cấp một số đối tượng gói cho bất kỳ loại tài nguyên nào. Trình hủy của đối tượng bao gói sau đó chịu trách nhiệm giải phóng tài nguyên, khi nó đi ra khỏi phạm vi của nó. Ví dụ:Có phải C++ giống như quản lý tài nguyên có thể trong Java

{ 
    auto_ptr<int> smartPointer = new int; 
    // some other code 

} // the memory allocated for the int is released automatically 
    // by smartPointer's destructor 

Cách sử dụng phổ biến nhất là con trỏ thông minh. Tuy nhiên, có rất nhiều loại tài nguyên khác (tệp, mutexes, ổ cắm, v.v.) có thể được quản lý chính xác theo cùng một cách.

Trong Java không phải bận tâm đến việc quản lý bộ nhớ. Nhưng tất cả các loại tài nguyên khác vẫn còn. Có cuối cùng là khối, nhưng việc sử dụng nó khá bất tiện, đặc biệt khi có nhiều trường hợp ngoại lệ khác nhau có thể được ném.

Vì vậy, câu hỏi của tôi là nếu có bất kỳ mẫu Java nào cung cấp chức năng tương đương với C++ RAII? Nếu không, hãy chia sẻ các phương pháp hay nhất của bạn trong lĩnh vực này (thay vì cuối cùng, trừ khi nó được sử dụng một cách tinh vi).

+0

Xem câu hỏi này: http://stackoverflow.com/questions/194261/raii-in-java-is-resource-disposal-always-so-ugly-was-i-had-a-dream – Eclipse

+0

Ngoài ra: http: : //stackoverflow.com/questions/477399/does-java-support-raii-deterministic-destruction – Eclipse

+0

"điều cực kỳ đơn giản hóa việc quản lý tài nguyên" bạn có đang đùa tôi không ?? – hasen

Trả lời

10

Bạn có thể sử dụng thông thường acquire; try { use; } finally { release; }. Hoặc bạn có thể tóm tắt việc xử lý tài nguyên với Execute Around idiom.

4

Joshua Bloch đã đề nghị bổ sung thêm một cơ chế gọi là Automatic Resource Management đến Java như là một phần của dự án Coin (thay đổi ngôn ngữ nhỏ cho JDK 7):

+0

Chỉ là cú pháp cú pháp (hữu dụng) để thử/bắt/cuối cùng. Vì vậy, nếu bạn muốn hoàn thành công việc hôm nay (trái ngược với năm 2011), hãy xem câu trả lời về try/catch/finally. –

+2

Ngoại trừ việc thử/cuối cùng hút so với RAII. Câu hỏi ban đầu là liệu Java có thể so sánh được với RAII hay không, và câu trả lời là, rõ ràng là không. –

1

Đối với nhiều lập trình viên, sức mạnh của các thành ngữ RAII là tuổi thọ của cơ bản tài nguyên được gắn với một khối phạm vi, làm cho mọi việc đơn giản hơn để thực hiện và duy trì; cuối cùng giảm lỗi từ việc không phát hành tài nguyên đó.

Thật không may là bạn không thể bắt chước hành vi này trong Java vì bạn không thể tạo cấu trúc giới hạn phạm vi của riêng bạn. Ngôn ngữ tương tự Java đã cố gắng giải quyết vấn đề này là C#:

// explicit release 
MyClass obj = MyClass(); 
obj.UseIt(); 
obj.Dispose(); 

// RAII-like (scope-bound) release 
using(MyClass obj = new MyClass()) 
{ 
    obj.UseIt(); 
} 

Có lẽ chúng ta sẽ thấy chức năng như thế này được triển khai trong tương lai.

+0

python cũng được thêm vào này với cấu trúc 'with' – hasen

+0

Điều đó không đúng. Bạn chắc chắn có thể mô phỏng nó trong java theo gợi ý của Tom Hawtin - tackline. – kirakun

+0

@Kirakun: mô phỏng "nó"; phạm vi? Trán tôi chỉ tăng một inch. –

Các vấn đề liên quan