2013-08-20 46 views
5

Các tài liệu mô tả phương pháp như:Class.getDeclaredFields() có trả về các thành viên theo thứ tự nhất quán không?

Các yếu tố trong mảng được trả về không được sắp xếp và đang không ở trong bất kỳ thứ tự cụ thể

Tuy nhiên tôi không chắc chắn nếu điều này ngụ ý rằng thứ tự sẽ không nhất quán mỗi khi ứng dụng gọi thường trình.

Tôi đang tìm cách ghép nối một ID duy nhất cho mỗi trường được tìm thấy - nhưng nó cũng cần nhất quán với lần chạy ứng dụng tiếp theo, tức là tạo ID tương tự.

Tôi muốn chỉ lặp qua từng Trường được tìm thấy và tăng số lượt truy cập cho mỗi phần tử được lặp lại. Sau đó gán ID của phần tử cụ thể cho bất kỳ bộ đếm nào bằng, các 'id' này không nhất quán mặc dù các Trường không được trả về theo thứ tự nhất quán.

Trả lời

4

Thứ tự không bắt buộc phải ổn định khi chạy. Tuy nhiên, giá trị hashCode() của trường được xác định là ổn định (được ghi là luôn luôn là field.getDeclaringClass().getName().hashCode()^field.getName().hashCode()), vì vậy bạn có thể sử dụng ID đó làm ID của bạn, với sự hiểu biết rằng mã băm không được đảm bảo là duy nhất.

Hoặc, bạn có thể sắp xếp các kết quả được trả lại từ getDeclaredFields() chính mình, sử dụng bất kỳ tiêu chí sắp xếp nào phù hợp với bạn.

+0

Cảm ơn câu trả lời trực tiếp. Tôi nghĩ tôi sẽ sắp xếp các trường theo tên trong bản đồ cây và sau đó áp dụng cùng một thuật toán mà tôi đã lưu ý ở trên để lấy các ID (tăng cho mỗi lần lặp) – Jeremy

+0

@Jeremy Không sử dụng 'TreeMap'. Chỉ cần sử dụng 'Arrays.sort'. –

3

Tuy nhiên tôi không chắc chắn nếu điều này ngụ ý rằng thứ tự sẽ không nhất quán mỗi khi ứng dụng gọi thường trình.

Nó không đảm bảo rằng nó sẽ nhất quán theo thời gian. Nhưng nó có thể nhất quán theo thời gian.

Và hành vi có thể khác nhau đối với các phiên bản hoặc nhà cung cấp JVM khác nhau. Và nó có thể bị ảnh hưởng bởi những thứ không mong muốn ... như tải lại lớp/tải lại, hoặc biên dịch lại JIT.

Tóm lại, ngay cả khi sơ đồ của bạn xuất hiện để hoạt động, nó có thể là dễ vỡ. Nó là không khôn ngoan để dựa vào hành vi không có giấy tờ.


Nó cũng phụ thuộc vào ý bạn là "theo thời gian". Nếu bạn có nghĩa là "theo thời gian" trong một lần chạy ứng dụng, thì đó là (IMO) nhiều khả năng thứ tự đó sẽ nhất quán hơn nếu bạn xem xét các lần chạy khác nhau của ứng dụng.

Cuối cùng, hãy cẩn thận khi sử dụng hashcode() để đặt hàng cho bạn. Hashcodes có thể va chạm, và nếu bạn bị va chạm, thứ tự của bạn sẽ không rõ ràng. Xác suất va chạm nhỏ nhưng không bằng 0 và nếu trường hợp sử dụng của bạn có liên quan đến bảo mật thì sẽ không khó cho người có kiến ​​thức về thuật toán để tạo ra xung đột.