在Salesforce的世界,凡事皆Metadata。
先通過一句經常使用的程式碼帶入一下:
Account accountItem = (Account)JSON.deserialize(accountString,Account.class);
這種程式碼相信大部分開發都會寫過,前臺將資料序列化,通過字串的形參傳遞給後臺,後臺將資料進行反序列化,從而獲取到這個表或者這個自定義類的例項。所以問題來了,為啥第二個引數是 Account.class?我們通過官方的API描述可能更好的進行了解。
這裡我們引出了 Type的概念,他是apex 預定的型別,包括 基礎資料型別(Integer等) , 集合, sObject型別以及 使用者定義的類。基礎資料型別等等都是 object型別,所以當我們理解salesforce裡面的型別時,可以簡單的分成兩個大類:Object & sObject。所以Type概念引入完了,它用來幹嘛?怎麼宣告?什麼時候用呢?
Type t1 = Integer.class; Type t2 = Type.forName('Integer'); system.debug(t1.equals(t2));
上面的簡單的demo中提供了兩種宣告Type的方式,一種是根據 object | sObject使用 .class宣告,另外一種是使用 Type的方法forName來例項化變數。既然變數可以宣告出來,我們就可以看看他的方法考慮如何搞事情了。
Type的方法非常少,所以我們想要檢視其對應的方法描述以及使用很容易就看完。這裡針對幾個重要的方法進行描述:
- forName(fullyQualifiedName):返回與指定的完全限定的類名相對應的型別。這裡的類名包括salesforce系統預製的類,自定義的類以及sObject名稱;
- isAssignableFrom(sourceType):如果object指定型別的引用可以從子型別分配,則返回true,否則返回false。這個方法我們可能首先會先想到 instanceof,因為都是來判斷型別是否相相容匹配,但是 instanceof必須是初始化這個類或者物件的變數,才能使用 instanceof 來進行判斷,使用 此方法可以省去了靜態編譯時的依賴,所以如果想判斷依賴性,可以優先考慮此方法。
- newInstance():此方法用來例項化一個指定Type的物件,返回型別是一個object物件,我們可以強制轉換成我們需要的物件型別。因為apex也是物件導向的語言,封裝,繼承,多型三大特性,我們可以通過 newInstance實現父子型別的輕鬆轉換呼叫相關的方法從而實現動態配置。
基礎資訊介紹完畢,此篇淺入淺出,介紹兩種可能用到的場景。
1. JSON序列化與反序列化
這個我們經常使用,一筆帶過:通過字串以及指定的 Type型別可以轉換成指定的資料型別。
Account accountItem = (Account)JSON.deserialize(accountString,Account.class);
2. 針對Custom Setting等根據配置的動態的類呼叫動態方法的使用
ParentClass是一個父類,有兩個變數以及一個虛擬的方法,繼承的子類可以進行實現
public abstract class ParentClass { public String param1 { get; set; } public String param2 { get; set; } public ParentClass() { this.param1 = 'value1'; this.param2 = 'value2'; } public virtual String joinParam() { return param1 + param2; } }
SonClass1繼承了它並實現了它相關的方法
public class SonClass1 extends ParentClass { public SonClass1() { super(); this.param1 = 'son value1'; this.param2 = 'son value2'; } public override String joinParam() { return super.joinParam(); } }
還有其他的SonClassn繼承了它並實現了它的相關的方法,我們在custom setting中配置了不同的場景應該呼叫的不同的子類,公共方法中,我們只需要使用以下的程式碼來判斷和呼叫即可。
public String executeJoin(String className) { Type t = Type.forName(className); Type t2 = Type.forName('ParentClass'); if(!t2.isAssignableFrom(t)) { throw new CustomException('should be son class of ParentClass'); } ParentClass newObj = (ParentClass)t.newInstance(); return newObj.joinParam(); }
總結:篇中簡單的介紹了salesforce中的 Type的使用,拋磚引玉,想要深入瞭解還要自行檢視官方文件。篇中有錯誤的地方歡迎指出,有不懂的歡迎留言。