2013-04-09 24 views
5

Tôi muốn viết một số mã xử lý sự cố mà tôi có thể dễ dàng loại bỏ sau này không gỡ lỗi các phiên bản của chương trình của tôi. Tôi đã đưa ra:Làm thế nào thông minh là Java về nếu các báo cáo với các biến cuối cùng

final static boolean debug_on=true; 
... 
if (debug_on) { system.out.println() or logger.log(...) } 

Java đủ thông minh để hủy câu lệnh if từ bytecode cuối cùng nếu debug == false?

Có cách nào tốt hơn để đạt được mục tiêu giữ mã gỡ lỗi ra khỏi phiên bản cuối cùng của chương trình không?

+0

bạn đã kiểm tra mã byte chưa? – PermGenError

+2

Điều này có vẻ dễ dàng để kiểm tra - biên dịch, và sau đó sử dụng javap để xem bytecode. (Tôi hy vọng nó sẽ được tối ưu hóa bởi JIT, chứ không phải javac) –

+0

Có thực sự đáng được tối ưu hóa điều này (thử nghiệm) bằng cách sử dụng một biến cuối cùng? Thông thường, một sử dụng một khung đăng nhập, và sau đó viết các câu lệnh như 'if (log.isDebugEnabled()) log.debug (" blah "+ x);'. Phép thử được thực hiện mỗi lần nhưng '" blah "+ x' không được đánh giá. –

Trả lời

5

Xem phần cuối của Java language specification chapter 14.21. Unreachable Statements cho một mô tả về if(false):

if (false) { x=3; } 

không dẫn đến một lỗi thời gian biên dịch. Trình biên dịch tối ưu hóa có thể nhận ra rằng câu lệnh x=3; sẽ không bao giờ được thực thi và có thể chọn để bỏ mã cho tuyên bố đó từ tệp lớp đã tạo, nhưng tuyên bố x=3; không được coi là "không thể truy cập" theo ý nghĩa kỹ thuật được chỉ định tại đây .

Lý giải cho điều trị khác nhau này là cho phép các lập trình viên để định nghĩa "biến cờ" như:

static final boolean DEBUG = false; 

và sau đó viết mã như:

if (DEBUG) { x=3; } 

Ý tưởng là nó có thể thay đổi giá trị của DEBUG từ sai sang true hoặc từ true thành false và sau đó biên dịch mã chính xác mà không có thay đổi nào khác đối với văn bản chương trình.

tl; dr; Nó phụ thuộc vào trình biên dịch cho dù các câu lệnh bên trong của bạn có bị bỏ qua trong bytecode hay không.

+0

Báo cáo không thể truy cập! Không nghĩ đến việc tìm kiếm nó bằng tên đó. Cảm ơn bạn ! –