2012-10-22 222 views
1

使用getFields()getDeclaredFields()獲取字段列表時,Java class中字段的順序未定義。保留註釋的順序

我需要此訂單在我的驗證庫中。由於訂單未被保留(儘管有人聲稱訂單保留在JDK 6及更高版本中,但無法保證跨VM)。我無法對此進行推測,因爲跨領域的註釋順序對於圖書館來說絕對是必不可少的。

一個辦法來解決這個問題是有一個orderindex屬性在我Annotation

讓我擔心的是,在下列情況下,代碼可能會變得有點麻煩。

  1. 如果用戶想要插入新的帶註釋的字段,那麼他可能必須重新編號該類中的所有其他註釋。
  2. 我能有orderindex作爲一個浮點數 - floatdouble但是,它不會好看有秩序,如1,1.5,2等,

會是什麼這個問題的優雅解決方案?

這裏是一個示例代碼,這樣就可以得到關於該問題的想法:

@Required 
@TextRule (minLength = 6, message = "You need at least 6 characters.") 
private EditText usernameEditText; 

@Password 
private EditText passwordEditText; 

@ConfirmPassword 
private EditText confirmPasswordEditText; 

@Email 
private EditText emailEditText; 
+0

將名稱排序爲字符串會出現什麼問題?看起來像我的自然順序(如果您更改名稱,您正在更改方法)。 – SJuan76

+0

@ SJuan76請檢查上面的代碼,字符串排序不會是一個選項。通過他們的名字看起來Dalvik VM訂單字段。所以註釋的順序也不會保留。 –

回答

0

我想說的順序並不固有類本身,但使用它取決於類的。所以我會考慮忘記修改原始類,並添加一個properties文件(可能與類的名稱相同)來定義順序。

如果您以後需要添加項目,則不要按1順序排序,而要使用10排序。第一種方法具有索引1,第二種方法具有索引11,依此類推。如果你需要重新編制索引,這將是不可能的,而且重新索引屬性文件很容易通過手工/程序完成。

+0

我正在編寫一個使用註釋來驗證UI小部件的框架,所以我的類使用了在其他類上聲明的Annotations。 –

0

目前沒有辦法實現這一點。因爲在Java 5之前,聲明字段的順序是未定義的。在Java 6和更高版本中,訂單被保留。另一方面,Dalvik虛擬機按升序對字段名進行排序。最後,我通過將attribute添加到我的註釋中來解決了這個問題。