Như tzaman đã nói, bí mật đang sử dụng cuối cùng; nói chung:
Resource r = allocateResource();
try {
// use resource
}
finally {
r.dispose();
}
Những điều cần lưu ý ở đây:
- thử và cuối cùng mỗi tạo ra một phạm vi khác nhau. Vì vậy, phân bổ tài nguyên của bạn trong mệnh đề try sẽ không hoạt động, vì nó sẽ không được hiển thị trong mệnh đề cuối cùng - bạn phải khai báo biến của tài nguyên trước câu lệnh try.
Nếu bạn có nhiều nguồn lực để phân bổ, mô hình chung áp dụng sạch, nhưng điều này thường không phải là hiển nhiên đối với người mới bắt đầu:
Resource1 r1 = allocateResource1();
try {
// code using r1, but which does not need r2
Resource r2 = allocateResource2();
try {
// code using r1 and r2
}
finally {
r2.dispose();
}
}
finally {
r1.dispose();
}
, và vân vân và vân vân nếu bạn có nhiều nguồn lực để phân bổ . Nếu bạn có một vài người trong số họ, bạn chắc chắn sẽ bị cám dỗ để cố gắng và tránh làm tổ sâu của cố gắng ... cuối cùng tuyên bố. Đừng. Bạn có thể nhận được tài nguyên deallocation và xử lý ngoại lệ ngay mà không làm tổ rất nhiều cố gắng ... cuối cùng tuyên bố, nhưng nhận được nó ngay mà không làm tổ thử ... cuối cùng thậm chí còn xấu hơn sâu làm tổ.
Nếu bạn thường xuyên cần phải sử dụng một tập hợp các nguồn lực, bạn có thể thực hiện một phương pháp functor dựa trên để tránh sự lặp lại, một cái gì đó như:
interface WithResources {
public void doStuff(Resource1 r1, Resource2 r2);
}
public static void doWithResources(WithResources withResources) {
Resource r1 = allocateResource1();
try {
Resource r2 = allocateResource2();
try {
withResources.doStuff(r1, r2);
}
finally {
r2.dispose();
}
}
finally {
r1.dispose();
}
}
nào thì bạn có thể sử dụng như thế này:
doWithResources(new WithResources() {
public void doStuff(Resource1 r1, Resource2 r2) {
// code goes here
}
});
doWithResources sẽ tự động xử lý phân bổ và deallocation chính xác, và mã của bạn sẽ có ít sự lặp lại (đó là một điều tốt). Tuy nhiên:
- cú pháp của Java cho các lớp học vô danh là quá dài dòng
- ngoại lệ Kiểm tra trong vòng doStuff những điều phức tạp quá nhiều
, hai điểm mà tôi hy vọng sẽ được giải quyết trong Java 7.
Bạn có thể tìm thấy loại mã này trong suốt mùa xuân, ví dụ:
Tôi không biết nhiều về 'with' hoặc Python cho vấn đề đó, nhưng nếu nó giống như C# 's' using', điều này đã được trả lời rất gần đây: http://stackoverflow.com/questions/ 2943542/using-keyword-in-java –
+1 nhưng: '[const]' '[final]' cũng tồn tại, vì vậy '[with]' cũng nên có một thẻ. Tôi chưa thể tạo ra nó. – n611x007