2013-08-20 4 views
5

документация описывает метод, как:Does Class.getDeclaredFields() возвращает члены в последовательном порядке?

элементов в массиве, возвращаемом не сортируются и не в определенном порядке

Однако я не уверен, если это означает, что заказ не будет быть последовательными каждый раз, когда приложение вызывает процедуру.

Я ищу способ создания уникального идентификатора для каждого найденного поля, но он также должен быть согласован с приложением, выполняемым в следующий раз, то есть непрерывно генерировать один и тот же идентификатор.

Я хочу просто перебрать каждое найденное поле и увеличить счетчик на каждый повторный элемент. Затем присвойте идентификатору определенного элемента значение счетчика равным, эти «идентификаторы» несовместимы, хотя если поля не возвращаются в последовательном порядке.

ответ

4

Заказ не обязательно должен быть стабильным в разных сериях. Однако значение поля hashCode() определено как стабильное (для него всегда должно быть field.getDeclaringClass().getName().hashCode()^field.getName().hashCode()), поэтому вы можете использовать его как свой идентификатор, понимая, что хеш-код не гарантированно будет уникальным.

Кроме того, вы можете сортировать результаты, полученные от getDeclaredFields() самостоятельно, используя подходящие критерии сортировки.

+0

Спасибо за прямой ответ. Я думаю, что я собираюсь сортировать поля по имени на древовидной карте, а затем применить тот же самый алгоритм, который я указал выше, чтобы получить идентификаторы (приращение на каждую итерацию). – Jeremy

+0

@Jeremy Не используйте «TreeMap». Просто используйте 'Arrays.sort'. –

3

Однако я не уверен, что это означает, что заказ не будет согласован каждый раз, когда приложение вызывает процедуру.

Это не гарантирует, что со временем это будет непротиворечивым. Но со временем это может быть последовательным.

И поведение может отличаться для разных версий или поставщиков JVM. И это может зависеть от неожиданных вещей ... например, разгрузка/перезагрузка класса или перекомпиляция JIT.

Короче говоря, даже если ваша схема появляется, чтобы работать, она может быть хрупкой. Неразумно полагаться на недокументированное поведение.


Это также зависит от того, что вы подразумеваете под «с течением времени». Если вы имеете в виду «со временем» в течение одного запуска приложения, то это (ИМО) более вероятно, что порядок будет согласован, чем если бы вы рассматривали разные прогоны приложения.

Наконец, остерегайтесь использования hashcode(), чтобы дать вам заказ. Хаскоды могут столкнуться, и если вы столкнетесь с конфликтом, ваш заказ будет неоднозначным. Вероятность столкновения мала, но не равна нулю, и если ваш прецедент связан с безопасностью, то для кого-то, кто знает об этом алгоритме, не составит труда произвести столкновение.

Смежные вопросы