2013-01-31 12 views
10

KHUYẾN CÁO: Tôi biết ý nghĩa và mục đích của @Deprecated.@Deprecated có ý nghĩa gì đối với các tham số phương thức và biến cục bộ?

Định nghĩa của @Deprecated chú thích trông như thế này trong mã nguồn của Java:

@Documented 
@Retention(RetentionPolicy.RUNTIME) 
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE}) 
public @interface Deprecated { 
} 

tôi hiểu mục đích của việc có giá trị mục tiêu của CONSTRUCTOR, FIELD, TYPE, METHODPACKAGE.

Tuy nhiên, ý nghĩa của việc đánh dấu tham số phương pháp hoặc biến cục bộ là @Deprecated là gì?

Ví dụ dưới đây biên dịch mà không có bất kỳ cảnh báo nào.

interface Doable { 
    void doIt(@Deprecated Object input); 
} 

class Action implements Doable { 

    @Override 
    public void doIt(@Deprecated Object input) { 

     String string = String.valueOf(input); // no warning! 

     @Deprecated 
     String localVariable = "hello"; 

     System.out.println("Am I using a deprecated variable?" + localVariable); // no warning! 
    } 
} 

Đây có phải là điều họ có thể định thực hiện trong tương lai không?


FWIW, tôi sử dụng JDK 1.7.0_11 trên Ubuntu 12.04 64bit. Kết quả là như nhau cho dù tôi chạy chương trình từ Eclipse hay dòng lệnh.

Trình biên dịch không phun ra cảnh báo cho bình thường cách sử dụng @Deprecated, chẳng hạn như sử dụng một trong các nhà thầu không được chấp nhận của lớp học java.util.Date. Chỉ để chứng minh rằng tôi không có một thiết bị đầu cuối bị lỗi hoặc thiết lập, đây là kết quả:

$ javac com/adarshr/Test.java -Xlint:deprecation 
com/adarshr/Test.java:12: warning: [deprecation] Date(int,int,int) in Date has been deprecated 
     new Date(2013, 1, 31); 
     ^
1 warning 
$ 
$ javac -version 
javac 1.7.0_11 
+0

Chỉ vì sự tò mò, bạn đang sử dụng trình biên dịch nào? và khi bạn viết '// không có cảnh báo', bạn có nằm trong IDE không? – ThanksForAllTheFish

+0

Tôi cố gắng để hiểu những gì một phương pháp không được chấp nhận với một đối số không được chấp nhận có thể có nghĩa là ... – assylias

Trả lời

7

có nghĩa là gì để đánh dấu một tham số phương pháp hoặc một biến địa phương như @Deprecated?

Nó có the same meaning as when applied to any other element:

Một yếu tố chương trình chú thích @Deprecated là một trong đó các lập trình viên không được khuyến khích sử dụng, điển hình là vì nó là nguy hiểm, hoặc vì một sự thay thế tốt hơn tồn tại. Trình biên dịch cảnh báo khi phần tử chương trình không dùng nữa được sử dụng hoặc ghi đè trong mã không được dùng nữa.


Tại sao không trình biên dịch bỏ qua cảnh báo cho các thông số được dùng nữa và các lĩnh vực trong Java 7?
Because that's exactly what the JLS (§ 9.6.3.6) dictates.

biên dịch

Một Java phải tạo ra một cảnh báo không dùng nữa khi một loại, phương pháp, lĩnh vực, hoặc constructor mà khai được chú thích với các chú thích @Deprecated được sử dụng (ví dụ:ghi đè, gọi hoặc tham chiếu theo tên), trừ khi:

  • Việc sử dụng nằm trong một thực thể được chú thích với chú thích @Deprecated; hoặc

  • Việc sử dụng nằm trong thực thể được chú thích để chặn cảnh báo bằng chú thích @SuppressWarnings("deprecation"); hoặc

  • Việc sử dụng và khai báo đều nằm trong cùng một lớp ngoài cùng.

Sử dụng @Deprecated chú thích trên một khai báo biến cục bộ hoặc trên tờ khai tham số không có tác dụng.

(nhấn mạnh thêm)

+0

Chính xác. Nhưng 'Trình biên dịch cảnh báo khi phần tử chương trình không được sử dụng được sử dụng hoặc ghi đè trong mã không được chấp nhận' sẽ không bao giờ xảy ra khi bạn sử dụng' @ Không được chấp nhận' trên các tham số phương thức hoặc biến cục bộ! – adarshr

+1

Bạn phải thấy rằng bên trong Eclipse; Tôi thấy như vậy. Tuy nhiên, khi tôi biên dịch với javac, tôi nhận được một cảnh báo. –

+0

Bạn có chắc chắn, bởi vì tôi không. Xem chỉnh sửa của tôi. – adarshr

2

Các JLS rõ ràng rằng các chú thích @Deprecation bị bỏ qua trên các biến địa phương. Xem câu trả lời của Matt Ball.

Đây có phải là điều họ có thể định thực hiện trong tương lai không?

Tôi rất nghi ngờ điều đó.

  • nó có thể có nghĩa là gì ... ngoài ý nghĩa hiện tại của nó như là một lời nhắc nhở không chính thức để implementor (và cờ có lẽ phong cách/PMD/FindBugs/etc) mà các biến địa phương cần phải được loại bỏ.

  • Mọi sự kiện chất liệu thay đổi có khả năng làm mất khả năng tương thích nguồn cho những người hiện đang sử dụng chú thích như trên. Các nhà bảo trì Java cố gắng rất nhiều để tránh phá vỡ mã cũ.

+0

+1 Rất tốt về tuân thủ ngược. – adarshr