2012-06-11 32 views
7

Tôi chạy vào một vấn đề đơn giản ngây thơ cố gắng để làm điều này:Tại sao tất cả các câu lệnh không được chú thích trong Java?

public void someMethod(){  
    int x = 0; 
    ... 
    @SuppressWarnings({"rawtypes", "unchecked"}) 
    x = ((Comparable)lhs).compareTo(rhs); 
    ... 
} 

này là bất hợp pháp và đã phải được viết lại để biên dịch:

public void someMethod(){ 
    ... 
    @SuppressWarnings({"rawtypes", "unchecked"}) 
    int x = ((Comparable)lhs).compareTo(rhs); 
    ... 
} 

Tôi đã bắt nguồn từ vấn đề này xuống ElementType: một tuyên bố dường như không phải là một phần tử chương trình hợp lệ. Điều này khá khó hiểu - tôi nghĩ rằng một tuyên bố là một cái gì đó giống như một siêu nhân của tất cả các yếu tố lập trình.

  1. Có lý do kỹ thuật hoặc lý do để hạn chế các thành phần hợp lệ không?

  2. Nó có thể được thực hiện khác nhau - tức là tôi có thể thay thế ElementType bằng lớp của riêng tôi và nắm vững các thay đổi gợn sóng, tôi có thể chú thích bất kỳ câu lệnh nào không?

+1

Nó không phải ở tất cả rõ ràng những gì bối cảnh là ở đây. Nó không giúp bạn thực sự không chỉ định chú thích. Thực sự, bạn đang cố gắng làm gì? –

+0

Những gì tôi đã cố gắng để làm và đã làm là để ngăn chặn một số cảnh báo trình biên dịch. Những gì tôi đang cố gắng làm bây giờ là hiểu được lý do sâu sắc hơn tại sao tôi không thể chú thích các câu lệnh ngẫu nhiên. Tôi không giỏi về lý thuyết ngôn ngữ lập trình, nhưng giới hạn dường như tùy ý này hấp dẫn tôi – kostja

+0

Vì vậy, hãy hiển thị * ngữ cảnh hoàn chỉnh *. Bạn đang cố gắng làm điều này trong một phương pháp, hoặc tuyên bố một biến dụ, vv? –

Trả lời

11

Nếu bạn nhìn vào the Javadoc for @SuppressWarnings bạn sẽ thấy câu trả lời: mục tiêu tuyên bố của nó là

@Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE}) 

Nói cách khác, nó không thể được về mặt pháp lý áp dụng cho một tuyên bố. Nó có thể, tuy nhiên, được áp dụng cho một tuyên bố biến. Nó không liên quan gì đến việc một câu lệnh là một phần tử chương trình hay không; về cơ bản là vì chú thích này chỉ áp dụng cho các khai báo của mọi thứ.

Hơn nữa, nếu bạn nhìn vào các câu lệnh và biểu thức the Javadoc for the enumeration that describes things that can have annotations, không nằm trong số các lựa chọn. Nói chung, các chú thích có thể được áp dụng cho các khai báo về mọi thứ, chứ không phải các bit mã.

Lý do lý thuyết cho điều này chỉ là chú thích được lưu trữ dưới dạng thuộc tính của từng mục được khai báo trong tệp lớp. Báo cáo không đủ điều kiện; vào lúc mã của bạn được biên dịch, các câu lệnh đã ngừng tồn tại. Chỉ có một dòng mã byte, và lời nhắc nhở duy nhất của các câu lệnh xuất phát là các bảng số dòng (tùy chọn). Để giải quyết vấn đề này, họ cần phải thêm thuộc tính mới vào tệp lớp để tham chiếu bytecode riêng lẻ, như trong this proposal, và xử lý một số phức tạp phát sinh như là kết quả.

+0

Cảm ơn, Ernest. Tôi biết về đặc điểm kỹ thuật. Câu hỏi đã có liên kết đến ElementType. Tôi muốn biết, TẠI SAO quyết định được thực hiện để hạn chế chú thích đối với các khai báo. – kostja

+0

aaah, tôi hiểu. Có ý nghĩa. – kostja

+0

Là một thành viên cũ của nhóm chuyên gia JSR-308, tôi phải bỏ phiếu này cho đoạn cuối cùng có chứa một số báo cáo không hợp lệ và phần lớn các dự đoán của tác giả, đặc biệt là xung quanh phần "chỉ số dòng". –

2

Tuyên bố trong Java là một thực thể có số nhận dạng và có thể được tham chiếu từ các phần khác của chương trình. Một câu lệnh không đáp ứng các tiêu chí đó - đó là một hành động có thể dẫn đến một giá trị được gán cho một thực thể được khai báo nào đó.

Mục 6.1 của thông số Java (http://docs.oracle.com/javase/specs/jls/se5.0/html/names.html#6.1) liệt kê các loại khai báo, phù hợp với các giá trị điều tra ElementType.

+0

Cảm ơn, Alex. Câu thứ hai làm cho nó rõ ràng hơn một chút với tôi - một tuyên bố không thể được tái lập. Bit tại sao tham chiếu quan trọng ở đây? Tuyên bố có vị trí trong cây cú pháp và có thể đạt được bằng traversal, vì vậy nó có thể được truy cập khác ... – kostja

+0

@kostja Không chắc chắn. Có thể nó có liên quan đến thực tế là chú thích thường được sử dụng trong thời gian chạy để nhận thông tin về các phần tử chương trình thông qua sự phản chiếu. Theo như tôi biết, không có cách nào để sử dụng sự phản chiếu để truy cập các câu lệnh trong một chương trình. – Alex

3

has been proposed là một phần của JSR-308 để cho phép chú thích trên bảng sao kê, nhưng hiện tại nó không được hỗ trợ và sẽ không là một phần của bản phát hành ngôn ngữ Java tiếp theo (ví dụ: Java 8).

Tôi đoán rằng tại thời điểm chú thích được thêm vào ngôn ngữ, thông tin cấp chính và cấp độ phương pháp chủ yếu được tạo xung quanh các trường hợp sử dụng thời gian chạy (ví dụ: Java EE, JPA, JAX-WS, v.v.) chú thích cấp độ chủ yếu có ích trong thời gian biên dịch (xem ở trên liên kết tới wiki để biết danh sách các ca sử dụng).

+0

Cảm ơn bạn đã tham khảo, Eugene. Nhìn về phía trước với JSR-308 rồi :) – kostja

5

Tôi biết câu trả lời đã được chấp nhận, chỉ cần ném điều này ra khỏi đó.Dưới đây là một đoạn trích từ FAQ cho JSR-175 mà ban đầu được thêm vào chú thích để Java:

Tại sao bạn không thể chú thích các yếu tố chương trình tùy ý như các khối và các tuyên bố cá nhân?

Điều này sẽ làm phức tạp cú pháp chú thích: Chúng tôi sẽ phải hy sinh sự đơn giản khi nói rằng chú thích chỉ đơn giản là công cụ sửa đổi, có thể được sử dụng trên các khai báo.

Nói cách khác, bởi vì nó quá nhiều việc :-)

+0

Cái đẹp, làm cho tôi xem xét lại câu trả lời được chấp nhận vì câu trả lời này từ miệng của con ngựa. Cảm ơn – kostja

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