2010-06-15 7 views
8

Câu hỏi rất ngắn: Có một cách thanh lịch hơn để làm điều này:Gán biến cuối cùng trong một khối try

Object tmp; 
try { 
tmp = somethingThatCanFail(); 
} catch (Fail f) { 
tmp = null; 
} 
final Object myObject = tmp; 
// now I have a final myObject, which can be used in anonymous classes 
+0

việc kiểm tra này ra tương tự như SO chủ đề này: http://stackoverflow.com/questions/2773779/problems-initializing-a-final-variable-in- java – froadie

Trả lời

12

Bạn có thể trích xuất việc tạo ra các giá trị trong phương pháp riêng của mình:

final Object myObject = getObjectOrNull(); 

public Object getObjectOrNull() { 
    try{ 
    return somethingThatCanFail(); 
    } catch (Fail f) { 
    return null; 
    } 
} 

Đó là lâu hơn, nhưng tùy thuộc vào định nghĩa của bạn về "tao nhã" nó có thể là nhiều hơn thanh lịch.

+0

+1 nhưng dù sao cuối cùng cũng chỉ là bảo mật nhưng bạn có thể giải quyết mà không có nó? –

+0

'final' là một công cụ rất hữu ích để ghi lại và thực thi các bất biến. Ngoài ra đôi khi nó được yêu cầu khi tương tác với các lớp bên trong vô danh. –

+0

Nó cũng được cho là giúp trình biên dịch với tối ưu hóa, nhưng tôi đoán nó có thể tự làm đủ điều đó. –

0

Phụ thuộc những gì bạn có ý nghĩa bởi "này" (và "thanh lịch hơn")

Tôi không chắc chắn lý do tại sao bạn nghĩ rằng bạn cần tmp và myObject, nhưng không có cách nào để tránh có một trong những khai báo bên ngoài khối thử NẾU bạn muốn truy cập nó trong khối catch.

Có gì sai với

Object myObject = null; 
try { 
    myObject = somethingThatCanFail(); 
} catch (Fail f) { 
    // do nothing because we can deal with myObject being null just fine 
} 
+2

Tôi nghĩ rằng câu hỏi là rõ ràng về việc gán một biến 'final'. –

+0

Vâng, phiên bản đã chỉnh sửa đã quên đề cập đến yêu cầu thực sự quan trọng đó! – dty

0

Những ngày này tôi có xu hướng để làm điều đó như

final Thingy zeFing; { 
    Thingy t = null; 
    try { 
     t = somethingThatCanFail(); 
    } catch (CurveBall f) { 
     // log... 
    } 
    zeFing = t; 
}