Tôi không hài lòng với quy tắc về phạm vi biến trong khối thử không được chia sẻ với việc bắt liên quan và cuối cùng là chặn. Cụ thể nó dẫn đến mã như sau:thử phạm vi khối
var v: VType = null
try {
v = new VType()
}
catch {
case e => // handle VType constructor failure (can reference v)
}
finally {
// can reference v.
}
Trái ngược với:
try {
val v = new VType()
}
catch {
case e => // handle VType constructor failure (can reference v)
}
finally {
// can reference v.
}
bất cứ ai có thể vui lòng giải thích hay biện minh cho lý do tại sao quy tắc này từ Java vẫn tồn tại?
và/hoặc có hy vọng rằng điều này có thể thay đổi không?
Cảm ơn!
CẬP NHẬT
Rất cám ơn tất cả các câu trả lời cho đến nay.
Sự đồng thuận dường như ngụ ý "cứ tiếp tục với nó" và tôi bắt đầu kết luận rằng có lẽ về mặt kỹ thuật những gì tôi muốn là không chắc chắn, không đáng nỗ lực hoặc khó đạt được.
Tôi thích câu trả lời của Rex Kerr nhưng làm thế nào mã ban đầu ở trên được gói trong một cuộc gọi phương thức mà không đưa vào một biến cục bộ trong thân phương thức?
Những nỗ lực của riêng tôi không quá tốt, sử dụng thông số bằng tên để trì hoãn việc xây dựng cho đến khi an toàn trong khối thử hoạt động nhưng vẫn không cho tôi truy cập vào đối tượng được xây dựng (hoặc không) khối.
Câu hỏi hay. Có vẻ như bạn phải giới thiệu một 'var' và bạn không thể sử dụng' val' trong 'try-catch-finally'-blocks, nơi bạn cần xóa một số tài nguyên hoặc bất cứ thứ gì. –
Dường như thiết kế bằng câu lệnh bắt không tạo ra lý tưởng ... Việc tạo một đối tượng được xác định trong câu lệnh khai thác lý tưởng vì nó là một quá trình nhanh và cung cấp hồi phục nhanh từ yêu cầu mạng không thành công, v.v. – Alex
ghi chú, rằng nếu constructor VType thất bại bạn làm * không * muốn chạm vào biến v, trừ khi bạn muốn nhìn thấy một null rỗng lớn. Ngoài ra hãy xem scala.util.control.Exception – jsuereth