我試圖在Android的訪問和緩存Web服務數據創建一個圖書館和跨越問題都有所涉獵。
我的圖書館管理的所有對象都繼承自基類Entity
類。任何派生類Entity
可以聲明其他字段 *或屬性 *。
基類負責返回要從緩存(SQLite或文件)或Web服務(REST或SOAP)中讀取的Entity
屬性。在我目前的實現中,Entity
類使用反射來執行此操作:它讀取所有標記有@Attribute
批註的類字段名稱。
問題
,我在我執行我遇到的問題是:每當我要求使用像static Set<String> getAttributes()
功能全部Entity
的屬性時,該功能必須創建一個Set
實現(目前使用HashSet
進行快速查找)。
我想避免每次請求所有屬性時分配和初始化Set<String>
。
從我的角度來看,屬性集特定於整個Entity
類,而不是Entity
對象。即:具有class Customer extends Entity
,所有Customer
實例具有相同的確切屬性 - 每個具有名稱,地址等。
我在這個當前的嘗試是聲明在每一個擴展Entity
類static Set<String> attributes
,並在類的static
塊這樣的使用反射初始化該Set
:
class Customer extends Entity
{
private static final Set<String> attributes = new HashSet<String>();
static
{
Entity.populateAttributes(Customer.class);
}
}
由於類初始化時,Entity
類可以查找在該類中標記爲@Attribute
註釋的所有字段,並且它是基類(例如,Customer extends Person
和Person extends Entity
將填充Customer.attributes
集,該集具有爲Customer
類聲明的屬性以及從繼承的屬性類)。
我遇到的問題是attributes
集合可能沒有爲延伸Entity
的類定義,我想在編譯時強制執行該集合。
我已經看到了這正在爲Serializable
接口在Eclipse中完成的:當創建一個實現Serializable
一個類時,Eclipse顯示一個警告,如果你的類不聲明[private] static final long serialVersionUID
。
問題
是否有我強制執行Serializable
行爲我Entity
類,並顯示警告或(更好的)一個錯誤,如果一個類沒有聲明的字段什麼辦法?
是否有不同的方法來返回屬性名稱爲Entity
派生類?
腳註
* 我用了field
於不應該由圖書館和應該由庫管理對象的屬性術語attribute
被管理對象的屬性(可從Web服務讀或SQLite的/文件緩存和在web服務或SQLite的/文件高速緩衝存儲器)
EDIT 1
乙被持久asical,我試圖實現的是以有效的方式得到一組Entity
的屬性*(見上面的腳註)。該列表由幫助類用於將對象值存儲在數據庫中(CREATE TABLE
查詢可以從屬性名稱和類型推斷出)或發送到Web服務。
這個庫是用於從Web服務的緩存值和同步本地數據庫(其中可能包含額外的用戶輸入值和可能的對象缺少服務器更新後的值),通過Web服務訪問的數據。它不打算在具有通用訪問器/增變器的應用程序中替換每場訪問器/增變器的使用。
這個概念被稱爲鍵 - 值編碼和使用於許多框架和庫。舉個例子,我用Google搜索找到的使用KVC的庫的前兩個例子是Cocoa和Sproutcore。參考文獻:Apple developer documentation和Sproutcore wiki。
KVC也用於Android開發。 Bundle
,SQLiteCursor
和ContentValues
激烈使用KVC。
「我的庫管理的所有對象都繼承自基礎實體類,任何派生類的實體都可以聲明其他字段*或屬性*。」或許這就是問題的核心。爲什麼不像其他人一樣使用數據成員,getter和setter?爲什麼要嘗試在Java之上構建自己的二流編程語言? – Raedwald 2013-03-07 13:15:54
我正在這樣做,以便處理數據源對象序列化/反序列化的類可以做到這一點,而無需爲添加到應用程序的每個「實體」修改。另外,另一種方法(如果我將序列化/反序列化責任移動到「Entity」類):我希望能夠將序列化/反序列化類從JSON REST-ful服務切換到SOAP或XML REST-ful服務,而不必修改應用程序中的每個「實體」。 – 2013-03-07 13:20:27
「我正在這樣做,以便處理數據源對象的序列化/反序列化的類可以做到這一點,而不必爲添加到應用程序中的每個實體修改」我會說這是尾巴搖擺狗。 Java是一種面向對象的編程語言:具有屬性,集合,關聯和增變器的設計對象。將序列化移入助手類。 – Raedwald 2013-03-07 13:23:42