2011-02-06 50 views
12

Có một thư viện hiện có cho phép tôi chú thích một phương thức Java như @Const, do đó trình biên dịch (sử dụng apt I presume) sẽ đánh dấu một lỗi nếu nó cập nhật một trường hoặc gọi phương thức không phải @ Const trên một trường ; và chú giải một tham số là @Const, sao cho phương thức chấp nhận không thể gọi bất kỳ phương thức nào không phải là @ Const, hoặc cập nhật bất kỳ trường nào của nó?Const tính chính xác trong Java bằng cách sử dụng chú thích?

(Về cơ bản, cố gắng để thêm const-đúng đắn để Java sử dụng các chú thích, có một số chi tiết rõ ràng không được đề cập trong câu hỏi trên, chẳng hạn như gán đến/từ một @ tham số Const, đánh máy, vv)

Tôi đã tìm thấy điều này: http://confluence.atlassian.com/pages/viewpage.action?pageId=182158080 nhưng có vẻ như nó chỉ có sẵn như là một phần của IDEA.

Sau một Yêu cầu làm rõ dưới đây, đây là mẫu mã để hiển thị những gì tôi muốn nói:

class Person { 
    private String name; 
    private String address; 

    @Const public String getName() { 
    return name; 
    } 

    public void setName(String name) { 
    this.name = name; 
    } 

    ... etc. for address 
} 

Bây giờ, nếu tôi xác định một phương pháp như:

void processPerson(@Const Person p) 

một dòng như: p.getName() sẽ là OK trong processPerson, kể từ getName đã được đánh dấu là phương thức @Const. Nhưng gọi số p.setName() từ trong phạm vi processPerson sẽ bị gắn cờ là lỗi.

Lưu ý rằng điều này là rất khác nhau từ final: nếu tham số được định nghĩa là final Person p, bất kỳ chuyển nhượng tới p sẽ là bất hợp pháp, nhưng nó vẫn hoàn toàn hợp lệ để thay đổi những gì p đề cập đến (hoặc sử dụng p.setName(...) hoặc thậm chí nhiều hơn nữa trực tiếp, với p.name = ....

+2

bạn có cố gắng sử dụng từ khóa 'final' cho mục đích này không? Có gì sai với nó? – AlexR

+4

phương pháp cuối cùng là phương pháp không thể ghi đè. Đó là khác nhau. – aioobe

+0

Tôi có nghĩa là không phải phương pháp cuối cùng. Tôi có nghĩa là đối số cuối cùng. Tôi biết phương thức cuối cùng là gì :) – AlexR

Trả lời

8
  • JSR-305 được cho là không chỉ là về những gì bạn đang tìm kiếm

  • Cá nhân, tôi muốn xem liệu tôi có thể sử dụng Hibernate Validator - Bean Validation (JSR-303) cho điều đó. Đó là một ít lib tuyệt vời (không phụ thuộc vào ngủ đông, nó nhỏ) và nó không kỳ diệu để giữ cho dữ liệu của bạn sạch sẽ. Xem documentation.

  • Một anh chàng google cũng đã bắt đầu Contracts for Java gần đây, nhưng có thể chưa phải là chất lượng sản xuất.

6

Hãy nhìn vào các Checker Framework, mà về cơ bản có cờ mà cố gắng để phát hiện lỗi phần mềm [JSR-305] thông qua một hệ thống kiểu chú thích mở rộng [JSR-308].

Trình kiểm tra có tính bất biến (2 thực tế) cho phép bạn chú thích mã bằng chú thích bất biến như @Mutable, @Immutable và @Readonly. Công cụ này phân biệt giữa một thể hiện bất biến và một tham chiếu chỉ đọc.

I yêu khung này và chủ yếu sử dụng nó để kiểm tra trống, nhưng tôi đang cố gắng bắt đầu sử dụng trình kiểm tra bất biến và kiểm tra interning hơn.

chú thích tham số là @Const, sao cho phương thức chấp nhận không thể gọi bất kỳ phương thức nào không phải là Const của nó hoặc cập nhật bất kỳ trường nào của nó?

sẽ trông giống như:

void addFriend(@ReadOnly Friend friend) { this.friends.add(friend); } 

cho phép tôi để chú thích một phương pháp Java như @Const, do đó trình biên dịch (sử dụng apt tôi đoán) sẽ cờ một lỗi nếu nó cập nhật một lĩnh vực, hoặc gọi phương thức không phải @ Const trên một trường; và

Nó sẽ giống như thế này ví dụ như trong câu hỏi:

public String getName(@ReadOnly Person this) { 
    return name; 
} 

Các @ReadOnly đây chỉ người nhận (các this dụ có phương pháp đang được gọi là) nên KHÔNG được sửa đổi. Mặc dù tham số thêm rõ ràng, phương pháp này vẫn được gọi như bình thường:

@ReadOnly Person person = new Person(); 
person.getName(); 

+1

Điều này là hoàn hảo, cảm ơn! Bạn đang tìm kiếm thứ gì đó như thế này cho lứa tuổi, rất vui khi cuối cùng cũng có nó với Java 8. Các công cụ rất mạnh mẽ, với một plugin Eclipse và với các trình bổ sung Maven, Ant, Gradle, vv, cho bất kỳ ai quan tâm. Chỉ một khuyến nghị là Chú thích IGJ trông có vẻ biểu cảm hơn trình kiểm tra Javari đối với bất kỳ ai bị nhầm lẫn bởi chồng chéo đối tượng địa lý. Javari có lẽ nên bỏ qua imho. (Ngoài ra - câu trả lời đã chỉnh sửa để sửa chú thích của người nhận trên phương thức.) –

0

Tôi BIỆT PHÁI @AlexR bình luận, điều này có thể được thực hiện bằng AspectJ, một cái gì đó dọc theo những dòng:

public aspect ConstAspect{ 
declare warning : withincode(* *(..,@Const (*),..)) : "Calling Const Method.."; 
} 

Điều này không đúng cho các yêu cầu của bạn, nhưng về cơ bản tôi muốn hiển thị một cách tiếp cận, Trong trường hợp trên, bất kỳ phương thức nào có @Const trên một tham số đều được gắn thẻ cảnh báo. Với một điểm tham gia tốt hơn, tất cả các điểm quan tâm có thể được gắn thẻ với một lỗi.

-4

const bằng C++. Java dường như đã bỏ nó vào mục đích. Và bây giờ mọi người lớn lên mà không thực sự có kinh nghiệm const nghĩ rằng đó là một ý tưởng tốt.

Khi bạn đã đánh dấu một phương thức là const, nó sẽ lan truyền như ung thư, bạn sẽ sớm thấy mình là const hầu hết mọi thứ. Sẽ tốt hơn nếu có một số not-const.

Hoàn toàn vô dụng. Nó chỉ hấp dẫn về mặt học thuật, không giúp ai trong chương trình thực sự.

+3

Rất, rất đáng tranh cãi. Tôi đã sử dụng 'const' rất nhiều trong các chương trình C++ của mình, và tôi không nhớ nó đang lan rộng. Đánh dấu getters là const và làm cho quá tải const của các toán tử truy cập (như 'operator []') thực sự giúp ngăn ngừa các sửa đổi ngẫu nhiên đối với các đối tượng. –

+4

Tôi nghĩ rằng const là tốt quá (8 năm kinh nghiệm C + +). Và về việc lan truyền - làm thế nào về đặc tả ngoại lệ trên một phương thức? Nó lây lan như ung thư, nhưng các nhà phát triển Java quản lý để sống với nó. – mark

+8

Đó là một điều tốt đẹp mà const lây lan như 'ung thư'. Càng nhiều công cụ, điều đó càng làm cho mã của bạn bị lạm dụng an toàn hơn. –

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