2010-06-24 28 views
7

Tôi đang làm việc trên một phân tích cho các chương trình Java yêu cầu thông tin có hiệu lực phụ về các cuộc gọi phương thức. Đối với các lớp thư viện chuẩn, tôi muốn biên dịch một danh sách các phương thức với các tham số chỉ đọc. Đó là, các phương pháp không sửa đổi các đối số của chúng, hoặc bất cứ điều gì có thể truy cập từ các đối số của chúng. Tôi có thể phỏng đoán rất nhiều từ javadocs, nhưng điều đó sẽ mất thời gian.Các phương pháp miễn phí có hiệu lực phụ trong Thư viện chuẩn Java

Ai đó có thể đề xuất một tham chiếu hoặc phương pháp dễ dàng hơn để xác định xem các cuộc gọi phương thức chuẩn có thay đổi đối số của chúng không? Đang đọc qua mỗi mục nhập javadoc thực sự là cách tốt nhất?

Cảm ơn!

EDIT: Tiền thưởng sẽ là xác định các phương thức không có tác dụng phụ đối với đối tượng. Ví dụ, stack.pop() trong khi stack.size() thì không.

+1

Tôi muốn được xem giải pháp của bạn. Bạn có thể giả định bất kỳ phương pháp nào có các loại bất biến là tác dụng phụ miễn phí. Bạn không chắc chắn những gì khác bạn có thể đi ra ngoài bên cạnh javadocs và mã. –

+0

@ SB: Chỉ cần nhớ rằng 'Chuỗi' là không thay đổi, nhưng các lớp thực thi' CharSequence' có thể có hoặc không. – Powerlord

Trả lời

1

Vâng, tất cả các phương thức chỉ sử dụng các kiểu/chuỗi nguyên thủy/Kiểu đối tượng/chung chung làm thông số sẽ thỏa mãn bạn mà không cần xem xét thêm. Và đối với java.lang và java.util, điều này sẽ bao gồm hầu hết các phương thức.

Nhưng bạn thực sự muốn giới hạn các gói bạn muốn xử lý, vì jdk tiêu chuẩn cung cấp thư viện lớp lớn cho tất cả các nhiệm vụ và mục đích.

chỉnh sửa
Đó là hơi fuzzier với nhiều loại generic khai báo là E extends ModifiableObject, vì vậy xem cho chính mình.

+0

Đó là một gợi ý tốt như là một điểm khởi đầu, cảm ơn. – Owen

1

Bạn có thể thử chạy một công cụ suy luận kiểu dựa vào mã nguồn của JDK.

Có thể sử dụng giấy Type qualifier inference for Java. (Toàn văn có vẻ không trực tuyến)

1

DMS Software Reengineering Toolkit là công cụ phân tích và biến đổi chương trình có thể tùy chỉnh chung. Nó có một số Java Front End phân tích cú pháp Java và tạo ra các bảng biểu tượng, quan hệ thừa kế lớp, điều khiển và thông tin luồng dữ liệu.

Từ thông tin này, thông tin địa phương về việc liệu phương thức M trực tiếp sửa đổi một đối số hay bất kỳ điều gì có thể truy cập từ một đối số có thể được tính toán. Một đồ thị cuộc gọi có thể được xây dựng, và bất cứ điều gì sửa đổi bởi một phương pháp X được gọi trực tiếp hoặc gián tiếp bởi M. Đó là hiệu quả câu trả lời của bạn. Bạn sẽ phải áp dụng điều này cho nguồn của mã quan tâm, trong trường hợp của bạn, thư viện Java Standard.

Định cấu hình DMS để thực hiện việc này không hề nhỏ nhặt ngay cả với tất cả thông tin được cung cấp. OTOH, câu trả lời này sẽ khá chính xác (các giả định và phản ánh modulo thận trọng), lặp lại và dễ áp ​​dụng cho bất kỳ phương pháp nào bạn chọn. Làm điều này bằng tay thông qua Javadocs có khả năng là rất tốn thời gian và dễ bị lỗi.

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