2013-08-20 50 views
5

的文檔描述的方法爲:Class.getDeclaredFields()是否以一致的順序返回成員?

返回未排序的數組中的元素,並且不以任何特定的順序

但是我不知道這是否意味着交易將不會每次應用程序調用例程時都保持一致。

我正在尋找一種方法來爲找到的每個字段配對一個唯一的ID - 但它也需要與下次應用程序運行時保持一致,即不斷生成相同的ID。

我想迭代每個找到的字段併爲迭代的每個元素遞增一個計數器。然後將特定元素的ID分配給計數器等於的任何值,但如果字段沒有以一致的順序返回,則這些'ids'不一致。

回答

4

訂單不需要在運行期間保持穩定。但是,該字段的hashCode()值被定義爲穩定的(記錄始終爲field.getDeclaringClass().getName().hashCode()^field.getName().hashCode()),因此您可以將其用作您的ID,同時瞭解哈希代碼不保證是唯一的。

或者,您可以自行排序從getDeclaredFields()返回的結果,使用適合您的任何排序標準。

+0

感謝您的直接回答。我想我會按照樹形圖的名稱對字段進行排序,然後應用上面提到的相同算法來獲取ID(每次迭代增加) – Jeremy

+0

@Jeremy不要使用「TreeMap」。只需使用'Arrays.sort'。 –

3

但我不確定這是否意味着每次應用程序調用該例程時該順序都不一致。

它不能保證它會隨着時間的推移而保持一致。但隨着時間的推移它可能會一致。

對於不同的JVM版本或供應商,行爲可能會有所不同。它可能會受到意想不到的事情的影響......比如類卸載/重載或JIT重新編譯。

總之,即使你的計劃出現工作,它很容易變得脆弱。依靠無證行爲是不明智的。


這也取決於你的意思是「隨着時間的推移」。如果您在應用程序的一次運行中意味着「隨着時間的推移」,那麼與您考慮應用程序的不同運行時相比,(IMO)更有可能該順序將保持一致。

最後,謹防使用hashcode()給你一個訂單。哈希碼可能會發生碰撞,如果碰到碰撞,您的排序將會不明確。碰撞的概率很小,但不是零,如果您的用例與安全性相關,那麼對於知道該算法的人來說,製造碰撞並不困難。

相關問題