2008-09-12 29 views
6

Trong C++, chúng ta có được một tài nguyên trong một hàm khởi tạo và giải phóng nó trong một trình phá hủy.Quản lý tài nguyên không đau trong java

Vì vậy, khi ngoại lệ tăng lên ở giữa chức năng, sẽ không có rò rỉ tài nguyên hoặc mutex bị khóa hoặc bất kỳ điều gì.

Các lớp java AFAIK không có trình phá hủy. Vậy làm cách nào để quản lý tài nguyên trong Java.

Ví dụ:

public int foo() {  
    Resource f = new Resource(); 
    DoSomething(f); 
    f.Release(); 
} 

thế nào có thể một nguồn phát hành nếu DoSomething ném một ngoại lệ? Chúng tôi không thể đặt try \ catch khối trên tất cả các mã, chúng ta có thể?

Trả lời

4

Có bạn có thể và nên đặt thử/bắt/cuối cùng chặn xung quanh mã của bạn. Trong C# có một cách viết tắt "sử dụng" tuyên bố, nhưng trong Java bạn đang bị mắc kẹt với:

public int foo() { 
    Resource f = new Resource(); 
    try { 
     DoSomething(f); 
    } 
    finally { 
     f.Release(); 
    } 
} 
0

Nếu bạn muốn khối sử dụng tham gia vào các cuộc tranh luận java đóng cửa: S

+0

cuộc tranh luận đó ở đâu? – Spoike

+0

Tất cả qua internet: http://www.google.dk/search?q=java+closures – svrist

-1

Xin lỗi vì đã làm bạn thất vọng nhưng trong Java, chúng tôi do sử dụng try \ catch \ cuối cùng chặn rất nhiều. Và với "rất nhiều", tôi có nghĩa là A LOT. Đôi khi tôi muốn Java có khối C# sử dụng. Hầu hết thời gian bạn sẽ không cần phải giải phóng tài nguyên vì bộ thu gom rác của Java sẽ chăm sóc điều đó.

Tuy nhiên, các trường hợp ngoại lệ có cách sử dụng của chúng trong việc xử lý lỗi xử lý nhiều hơn. Bạn có thể viết ngoại lệ của riêng bạn và bắt chúng cho bất cứ điều gì bạn đang làm. Không còn phải trả lại mã lỗi tùy ý cho người dùng!

+1

Có! Hãy bắt đầu trả lại cho họ những dấu vết ngăn xếp rối rắm xấu xí với họ! –

+0

Ah điều kỳ diệu của việc nhận được một NullPointerException chứ không phải là một -429321313 Hộp thoại mã lỗi. Làm cho tôi tự hào là nhà phát triển :) –

+1

Java 7 sẽ có "quản lý tài nguyên", một tính năng sẽ đóng tất cả các tài nguyên 'Có thể mở rộng 'khi sử dụng một dạng đặc biệt của khối' try'. –

3

Có thể tính hệ số thử/cuối cùng (và ngoại lệ và thuật toán) bằng cách thực thi thành ngữ xung quanh thành ngữ. Tuy nhiên cú pháp rất cao.

public int foo() { 
    withResource(new WithResource() { public void run(Resource resource) { 
     doSomething(resource); 
    }}); 
} 

... 

public interface WithResource { 
    void run(Resource resource); 
} 

public static void withResource(WithResource handler) { 
    Resource resource = new Resource(); 
    try { 
     handler.run(resource); 
    } finally { 
     resource.release(); 
    } 
} 

Điều này có ý nghĩa hơn nếu bạn đang trừu tượng hơn thử/cuối cùng. Ví dụ, với JDBC bạn có thể thực thi một câu lệnh, lặp qua các kết quả, đóng các tài nguyên và bọc ngoại lệ.

+0

với (new Resource() {public void do (tài nguyên) .... đọc tốt hơn một chút.:-) –

+2

Nó có, nhưng nó sai trong nhiều hơn một cách. ;) –

4

Câu hỏi này có từ năm 2008 và do đó liên quan đến Java 6. Kể từ đó Java 7 đã được phát hành, trong đó có một tính năng mới cho Quản lý tài nguyên tự động. Đối với một câu hỏi gần đây có liên quan đến Java 7, hãy xem câu hỏi này:

java techniques for automatic resource release? "prompt cleanup"?

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