Đây có phải là một cách thực hành tốt để sử dụng các cảnh báo triệt tiêu trong mã của bạn không?


11

Tôi sử dụng @SuppressWarnings("unchecked")@SuppressWarnings("null")hầu hết các phương thức trên để cho phép biên dịch mã mà không có bất kỳ cảnh báo nào nhưng tôi có nghi ngờ của mình. Tìm thấy câu hỏi Stackoverflow này . Jon Skeet đã viết một câu trả lời cho nó mà tôi thấy hấp dẫn.

Theo như anh ấy,

Đôi khi, các tổng quát Java không cho phép bạn làm những gì bạn muốn và bạn cần nói với trình biên dịch một cách hiệu quả rằng những gì bạn đang làm thực sự sẽ hợp pháp tại thời điểm thực thi.

Nhưng nếu có cơ hội, một ngoại lệ sẽ bị ném thì sao? Không phải là đàn áp cảnh báo là một ý tưởng tồi? Tôi không nên nhận thức được những nơi mà vấn đề có thể nổi lên?

Ngoài ra, nếu người khác sửa đổi mã của tôi sau này và thêm một số chức năng đáng ngờ mà không xóa SuppressWarnings thì sao? Làm thế nào điều đó có thể tránh và / hoặc có bất kỳ sự thay thế nào khác cho điều này?

Tôi có nên sử dụng @SuppressWarnings("unchecked")@SuppressWarnings("null")?


Cập nhật số 1

Theo như câu hỏi loại không được kiểm tra, theo câu trả lời này (được @gnat chỉ ra trong các bình luận bên dưới), việc loại bỏ các cảnh báo này là cần thiết.

Nhiều thư viện Java không thể thiếu chưa bao giờ được cập nhật để loại bỏ nhu cầu về các kiểu chữ không an toàn. Việc ngăn chặn những cảnh báo đó là cần thiết để những cảnh báo quan trọng khác sẽ được chú ý và sửa chữa.

Trong trường hợp ngăn chặn các cảnh báo khác, vẫn còn trong một khu vực màu xám.


Cập nhật số 2

Theo tài liệu Oracle (cũng được đề cập bởi một số câu trả lời dưới đây):

Là một vấn đề về phong cách, các lập trình viên nên luôn luôn sử dụng chú thích này trên phần tử lồng nhau sâu nhất, nơi nó có hiệu quả. Nếu bạn muốn loại bỏ một cảnh báo trong một phương thức cụ thể, bạn nên chú thích phương thức đó thay vì lớp của nó.



@gnat Họ không nói về các loại phôi không được kiểm tra‽
Bilesh Ganguly

1
họ làm : "Nhiều thư viện Java không thể thiếu chưa bao giờ được cập nhật để loại bỏ sự cần thiết của các kiểu chữ không an toàn. Việc loại bỏ các cảnh báo đó là cần thiết để các cảnh báo quan trọng khác sẽ được chú ý và sửa chữa."
gnat

2
Tôi nghĩ vấn đề với bản sao đó là về C # - có một số lý do cụ thể của Java khác với ý tưởng chung về việc loại bỏ các cảnh báo của trình biên dịch.

Câu trả lời:


26

Đối với tôi, toàn bộ quan điểm ngăn chặn các cảnh báo là duy trì "dự luật sức khỏe sạch" cho dự án của bạn. Nếu bạn biết rằng toàn bộ cơ sở mã của bạn biên dịch sạch sẽ, điều đó rõ ràng ngay lập tức khi ai đó làm sai điều gì đó khiến cảnh báo đầu tiên xuất hiện trong danh sách các vấn đề. Sau đó, bạn có thể sửa lỗi hoặc loại bỏ lỗi nếu bạn có thể chứng minh rằng đó là giả mạo.

Nhưng nếu bạn có 21 cảnh báo ở đó để bắt đầu, nhiều khả năng bạn sẽ bỏ qua cảnh báo thứ 22 khi ai đó gây ra và bạn không kiểm tra xem điều đó có vô hại không. Điều đó có nghĩa là các vấn đề có thể len ​​vào cơ sở mã của bạn và bạn sẽ không bao giờ nhận thấy.

Cảnh báo là mục hữu ích của thông tin. Hãy chắc chắn rằng bạn chú ý đến những người nói lên sự thật và lọc đi những điều không nên. Đừng để mọi người kết hợp hai loại để bạn mất hệ thống cảnh báo sớm.

Biên tập

Tôi có lẽ nên làm rõ rằng việc đàn áp một cảnh báo không có công là một điều ngớ ngẩn để làm. Một hóa đơn sạch của sức khỏe mà bạn có được bằng cách gian lận rõ ràng là không có giá trị. Đưa ra lựa chọn, bạn nên luôn luôn khắc phục sự cố mà trình biên dịch nhận thấy thay vì chỉ nhắm mắt vào nó. Tuy nhiên, có những khu vực trong đó trình biên dịch không thể chắc chắn liệu có vấn đề gì hay không (khái quát của Java là một trong những khu vực như vậy) và có lựa chọn tốt hơn là xem xét từng trường hợp như vậy và sau đó loại bỏ cảnh báo ở nơi cụ thể này hơn là tắt hoàn toàn lớp cảnh báo này và có khả năng bỏ lỡ một cảnh báo chính hãng.


1
Tôi đồng ý một phần rằng bắt đầu từ một bảng "sạch" sẽ giúp bạn nắm bắt các cảnh báo sau này, thực tế là mã được biên dịch sạch có thể không chạy sạch.
dùng949300

Vấn đề tôi gặp phải trong công việc là tôi thường gặp phải những cảnh báo mà người khác đàn áp vì họ không hiểu những gì nó đang nói. Vì vậy, tôi đoán liệu một cảnh báo có công đức là một vấn đề chủ quan. : /
Trejkaz

16

Kìm nén cảnh báo là điều cần được thực hiện với sự cẩn trọng cao độ.

Một cảnh báo có nghĩa là: Trình biên dịch tìm thấy một cái gì đó trông tinh ranh. Nó không có nghĩa nó tinh ranh, nó chỉ trông giống như nó để trình biên dịch. Đôi khi bạn có mã hoàn toàn tốt và đưa ra cảnh báo. Đôi khi bạn sửa nó bằng cách sửa đổi một chút mã của bạn. Đôi khi trình biên dịch có một số tính năng đặc biệt cho mục đích đó. Ví dụ

if (x = someFunction ()) { ... }

đưa ra một cảnh báo nhưng

if ((x = someFunction ())) { ... }

không. Trong trường hợp đầu tiên, một cảnh báo giả định rằng bạn có thể có nghĩa == và không =. Trong trường hợp thứ hai, không có cảnh báo nào vì các dấu ngoặc đơn phụ cho trình biên dịch "Tôi biết tôi đang làm gì". Tất nhiên tốt hơn sẽ là

if ((x = someFunction ()) != 0) { ... }

hoặc sử dụng hai dòng.

Và đôi khi, rất hiếm khi, có những trường hợp khi mã của bạn ổn nhưng bạn không thể quản lý để viết nó theo cách được chấp nhận mà không cần cảnh báo. Trong trường hợp rất, rất hiếm khi bạn vô hiệu hóa cảnh báo cho câu lệnh đó và bật nó ngay lập tức sau đó. Đó là phương sách cuối cùng. Và bạn chỉ vô hiệu hóa cảnh báo cụ thể đó, không có người khác.

Tuy nhiên, một số người chỉ vô hiệu hóa các cảnh báo để loại bỏ các cảnh báo, bởi vì họ quá lười biếng để tìm hiểu và khắc phục lý do cho một cảnh báo hợp pháp trước tiên. Hoặc họ thậm chí không cố gắng viết mã không có cảnh báo. Đó là một điều cực kỳ không lành mạnh để làm.


2
Tôi nghĩ rằng bạn có thể thiếu một số dấu ngoặc đơn đóng trong các ví dụ thứ hai và thứ ba của bạn.
8bittree

1
Hoàn toàn đồng ý với câu cuối cùng
usr-local-

7

Ức chế cảnh báo cho toàn bộ phương pháp là nghi ngờ. Tốt hơn để ngăn chặn các cảnh báo cho dòng cụ thể, với một bình luận . ví dụ

@SuppressWarnings("unchecked") Foo foo = (Foo)object; // Using old library requires this cast

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.