2010-09-27 36 views
33

Bạn có sử dụng từ khóa này hoặc ném một số ngoại lệ thời gian chạy xác thực không? Nó mang lại lợi ích gì cho bạn hoặc tại sao bạn cho rằng nó không đáng để sử dụng?Từ khóa khẳng định trong java

Trả lời

54

Khẳng định sẽ phát một lỗi thời gian chạy (AssertionError) nếu điều kiện của nó sai. Asserts cung cấp cho bạn một cách sắp xếp hợp lý để ghi lại, kiểm tra và thực thi các tiêu chí chính xác cho mã của bạn. Lợi ích là móc nối ngôn ngữ để xác định và điều khiển các điều kiện chính xác này. Trong phạm vi mà bạn muốn kích hoạt hoặc vô hiệu hóa chúng (có những tranh cãi về việc đây có phải là một ý tưởng hay không), bạn có thể thực hiện điều đó từ dòng lệnh JVM. Một số người nhận xét bên dưới lưu ý rằng các xác nhận bị tắt theo mặc định trừ khi đang chạy trong chế độ gỡ lỗi; thực hành của tôi là thêm "-ea" (cho phép xác nhận) trong các kịch bản trình bao bọc của tôi mọi lúc. Ngay cả trong mã hiệu suất nhạy cảm, đối với tôi sự cân bằng có lợi cho sự tự tin về tính bảo mật/chính xác mà tôi nhận được từ các xác nhận. Assertions at OracleAPI Description for AssertionError

Lưu ý sự khác biệt giữa các lỗi dự kiến ​​hoặc không mong muốn (ngoại lệ). điều kiện đặc biệt. Nếu xảy ra lỗi xác nhận, diễn giải là lập trình viên đã hiểu sai hoặc biểu thị sai chương trình, thay vì các lỗi khác hoặc lỗi khác. Trong thực tế, tôi sử dụng nó để ghi lại các giả định rõ ràng hoặc không rõ ràng mà tôi thực hiện và bất biến mà tôi muốn thực thi khi tôi sản xuất (đặc biệt là nội bộ/riêng) mã, làm rõ cho chính mình và những người khác tại sao các giả định này được thực hiện , nơi chúng được tạo ra và liệu chúng có được xác nhận hay không. Tốt hơn nhiều so với ý kiến ​​cho cùng một hiệu ứng. Đây là một bước (nhỏ) về phía Design by Contract.

Tham số kiểm tra hiệu lực của mục Java "(Google Books, Amazon.com) cung cấp bản trình bày hữu ích về sự khác biệt giữa kiểm tra tham số và sử dụng xác nhận phù hợp.

liên quan về SO: (Enabling assertions in netbeans), (Assertions vs. Exceptions), (Near duplicate, asking for examples), (Badly named, but very similar content)

+10

Muốn thêm xác nhận đó theo mặc định bị vô hiệu hóa khi chạy. Có các công tắc dòng lệnh (-enableassertions, hoặc -ea) có sẵn để chọn lọc xác nhận. –

+2

Tôi nghĩ bạn có nghĩa là "bị vô hiệu hóa trong mã không gỡ lỗi" thay vì "bị vô hiệu hóa khi chạy". – DJClayworth

+0

Sử dụng Netbeans, làm thế nào để tôi gắn bó trong -ea? – Pete

3

andersoj là đúng. Chỉ cần cho bạn biết, điều tuyệt vời về xác nhận là bạn có thể đơn giản tắt nó đi (nếu bạn không vượt qua -ea trong dòng lệnh java). Điều đơn giản này làm cho chúng hoàn hảo để sử dụng trong phát triển, khi bạn muốn chắc chắn rằng bạn không phá vỡ mã của riêng bạn.  

-2

bạn có thể sử dụng nó để bật nội dung nào đó trong khi phát triển, sau đó tắt hoàn toàn trên trang web trực tiếp. ví dụ:

... 
assert debug("xxx"); 
... 

static boolean debug(String format, Object... args){ print(...); return true; } 

tuyên bố gỡ lỗi sẽ thêm phí trên không trên trang web trực tiếp.

+6

Bạn có nghĩ rằng đó là thực hành tốt? Tôi nghĩ rằng nó tốt hơn sử dụng một số phương pháp Logger.debug() hoặc một cái gì đó như thế này. –

+0

Tôi nghĩ rằng thực hành tốt nhất thường được chấp nhận là để tránh xa loại điều này, tránh các cuộc gọi phương thức có khả năng phức tạp. Đặc biệt là nếu có một số tiềm năng cho tác dụng phụ (và tôi sẽ đếm đầu ra để stdout như là một "tác dụng phụ"). – andersoj

0

Để chính xác về câu hỏi của bạn:

Xác nhận được sử dụng để xác thực điều kiện của câu lệnh.

assert (some condition) 
Example : assert (6 < 7) // condition pass 
      assert (6 > 7) // throws AssertionException here 

Hầu hết mọi người sử dụng khẳng định đối với trường hợp sử dụng sau đây để String: (Nhưng cá nhân tôi ghét phải sử dụng khẳng định cho nó):

assert (obj != null || obj.isEmpty() || ...) 

tôi giống như sử dụng google ổi đó là sạch sẽ và phục vụ mục đích:

Obj.isNullOrEmpty() 

Thông tin thêm: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Strings.html

3

Nó mang lại lợi ích gì cho bạn hoặc tại sao bạn cho rằng nó không đáng để sử dụng?

Sử dụng xác nhận kiểm tra bắt buộc, như những người khác đã đề xuất là thực hành nguy hiểm.

Điều gì xảy ra khi nhà phát triển khác sử dụng thư viện của bạn? Hoặc quản trị viên hệ thống hoặc người dùng Power quên hoặc tệ hơn không biết, để bật xác nhận với cờ -ea khi chạy? Bạn mất tất cả các kiểm tra, đó là những gì.

Xác nhận là công cụ phát triển. Thực tế là trạng thái mặc định của cờ là tắt là số tiền đã chết.

Không có tính năng hoặc lợi ích nào trong ứng dụng của bạn nên phụ thuộc vào xác nhận đang được bật.

Là nền, các xác nhận được sử dụng giống như cách thức trong C/C++ khi tính năng được lấy từ đó. Trong C/C++, nhà phát triển thường có thể vượt qua trong #define DEBUG ... lúc biên dịch để bật hoặc tắt xác nhận. Với mã sản xuất C/C++ thường có tính năng này tắt.

Về mặt khái niệm, điều này cũng đúng với Java. Trong sản xuất, sử dụng điều kiện và ngoại lệ. Về cơ bản chúng giống nhau.

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