Chúng tôi có một dự án Java. Chúng tôi kích hoạt các cờ -Xlint
(bật cảnh báo) và -Werror
(xử lý cảnh báo là lỗi) cho javac
, để đảm bảo mã của chúng tôi không bị cảnh báo. Gần đây chúng tôi quyết định từ chối một lớp học. Vấn đề là trong một số trường hợp, @SuppressWarnings("deprecation")
sẽ không ngăn chặn cảnh báo không dùng nữa, dẫn đến lỗi xây dựng. Dưới đây là danh sách các trường hợp sử dụng mà tôi đã gặp phải:Làm thế nào để tránh cảnh báo không dùng nữa khi @SuppressWarnings ("không dùng nữa") không hoạt động?
- Nhập vào các lớp không được chấp nhận khác.
- Nhập trong các lớp không được chấp nhận khác.
- Cấp độ gốc.
Thông số loại. Ví dụ
@SuppressWarnings("deprecation") public class Foo extends Bar<DeprecatedClass> { ... }
Tuy nhiên, điều này không có cảnh báo ngay cả khi không đàn áp:
@Deprecated public class DeprecatedClass extends Bar<DeprecatedClass> { ... }
AFAIK, không có cú pháp cho nhập khẩu chú thích, vì vậy đối với trường hợp 1 và 2 giải pháp của chúng tôi là hoặc nhập * hoặc tránh nhập. Đối với trường hợp 3 và 4, cả Java 6 và 7 đều không chặn cảnh báo. Java 8 sẽ triệt tiêu chính xác nó (có thể một lỗi đã được sửa). Cho đến nay không có giải pháp cho việc này.
Thật không may, chúng tôi phải hỗ trợ Java 6, 7 và 8 tại thời điểm này. Có cách nào để giải quyết vấn đề không? Nó là một khối đường cho sự phát triển Java API của chúng tôi.
PHỤ LỤC
Nhiều người hỏi tại sao chúng ta vẫn sử dụng lớp phản đối trong codebase của chúng ta. Lý do là dự án là một thư viện, hỗ trợ nhiều khách hàng khác nhau. Khi giới thiệu API thay thế mới, trước tiên chúng tôi phải từ chối API cũ của chúng tôi, hãy giữ nó trong mã nguồn của chúng tôi, chờ tất cả khách hàng di chuyển rồi xóa nó. Có ba trường hợp sử dụng chung:
- Chúng tôi không dùng lớp
Foo
vàBar
, nơiFoo
kéo dàiBar
. Đây là trường hợp 2 và 3 trong câu hỏi của tôi. - Chúng tôi không dùng nữa lớp
Foo
vàBar
, trong đóFoo
kéo dàiCollection<Bar>
. Đây là trường hợp 2 và 4. - Chúng tôi phải giữ tất cả mã kiểm tra cho lớp
Foo
vàBar
. Mã thử nghiệm nhập khẩu các lớp này. Đây là trường hợp 1.
Tại sao phải kiểm tra? Đừng quên rằng nếu một lỗi nghiêm trọng (ví dụ: rò rỉ bộ nhớ, sự cố bảo mật) được phát hiện và khách hàng không thể dễ dàng di chuyển sang phiên bản mới, chúng tôi vẫn cần cung cấp sửa lỗi cho API cũ. Và tất cả các thay đổi phải được kiểm tra.
Tôi cảm thấy tình hình của chúng ta nên khá phổ biến trong phát triển thư viện phần mềm và phát triển API. Đáng ngạc nhiên là phải mất Java thời gian dài (cho đến Java 8) để sửa lỗi.
Có thể không có nhiều tùy chọn. Bạn có thể thay đổi quá trình xây dựng của bạn để không có '-Werror' trừ khi target == 8, hoặc loại trừ cảnh báo không dùng nữa vì điều đó dường như bị hỏng trong 6 và 7. Hoặc bạn không thực hiện phản đối tiêu chuẩn (imo một thay thế xấu): Bỏ qua ngừng sử dụng và xóa lớp xấu ngay lập tức, "không dùng nữa" bằng cách đặt ghi chú trên web/javadoc hoặc trong trường hợp tác phẩm đó cũng không dùng nữa mọi lớp sử dụng nó làm tham số kiểu ngay cả khi nó sẽ ở lại trong trường hợp lớp không dùng nữa biến mất. Http://stackoverflow.com/a/20909204/995891 liên quan đến 1) & 2) – zapl
Tôi nghĩ rằng không nên từ chối trường hợp 3 và đặt '@ không được chấp thuận 'ở Javadoc có thể là phương sách cuối cùng, nếu không có cách tiếp cận nào tốt hơn. –
Vì bạn đang tham khảo nó như là kiểu thay vì lớp, bạn có thể mở rộng bằng cách sử dụng kiểu generic, và cast vào 'DeprecatedClass' sau này, với một sự hạn chế cảnh báo xung quanh diễn viên? – CharlieS