考慮到手機端開發環境的限制(尤其是 iOS 系統),以及保持介面定義的簡單,服務端在定義行動服務介面時,不能使用 Java 文法的全集。
介面定義規範涉及三類定義:
內部支援資料類規範:已支援的 Java 原生類和封裝類。
使用者介面類規範:使用者定義的 interface,包含 API 呼叫的 method 聲明。
使用者定義實體類規範:使用者定義的實體 class(包含 field 聲明),介面類中 method 參數或傳回值、其它使用者定義實體類將會引用到。
內部支援資料類規範
不支援的資料類型
容器類型不能多層嵌套。
List 或 Map 必須有泛型資訊。
List 或 Map 的泛型資訊不能是 array 類型
不支援單位元組(位元組資料 byte [] 是支援的)
不支援對象數組,請用 list 代替。
屬性名稱不能是 data 和 description,會與 iOS 的屬性衝突。
Map 類型的 key 必須是 String 類型。
類型不能是抽象類別。
類型不能是介面類。
錯誤的寫法:
public class Req {
private Map<String,List<Person>> map; //容器類型不能多層嵌套。
private List<Map<Person>> list; //容器類型不能多層嵌套。
private List list1; //List 或 Map 必須有泛型資訊。
private Map map1; //List 或 Map 必須有泛型資訊。
private List<Person[]> listArray; //List 或 Map 的泛型資訊不能是 Array 類型。
private byte b; //不能為單位元組
private Person[] personArray; //不支援對象數組,請用 List 代替
private String description; //屬性名稱不能為 description
}支援的資料類型
boolean, char, double, float, int, long, short
java.lang.Boolean
java.lang.Character
java.lang.Double
java.lang.Float
java.lang.Integer
java.lang.Long
java.lang.Short
java.lang.String
java.util.List,但:必須使用型別參數;不能使用其具體子類 以下簡稱 List
java.util.Map,但:必須使用型別參數;不能使用其具體子類;key 類型必須是 String 以下簡稱 Map
Enum
byte[]正確的寫法:
public class Req {
private String s = "ss";
private int i;
private double d;
private Long l;
private long l1;
private boolean b;
private List<String> stringList;
private List<Person> personList;
private Map<String,Person> map;
private byte[] bytes;
private EnumType type;
}
public class Person {
private String name;
private int age;使用者介面類規範
method 的參數
不可以引用:
枚舉類型
除上文提到的 Map、List、Set 之外的泛型
抽象類別
介面類
原生類型的數組
可以引用:
具體的實體類,要求參考型別與實際的物件類型保持一致;不可使用父類參考型別指向子類對象。
內部支援資料類,但數組、Map、List、Set 這些集合類型不可以嵌套。
如下是錯誤樣本:
Map<String,String[]>
Map<String,List<Person>>(Person為一個具體的實體類)
List<Map<String,Persion>>
List<Persion[]>method 的傳回值
不可以引用:
枚舉類型
除上文提到的 Map、List、Set 之外的泛型
抽象類別
介面類
原生類型的數組
可以引用:
具體的資料類,要求參考型別與實際的物件類型保持一致;不可使用父類參考型別指向子類對象,例如,不能用 Object 引用指向其它對象。
重要如果父類為具體類,產生工具將檢查不出此類錯誤。
內部支援的資料類見文章開頭定義。數組、Map、List、Set 集合類型不可以嵌套,參見上文相關樣本。
method 的定義
使用
@OperationType註解,未加此註解的方法將被產生工具忽略。method 不可 overloading。
代碼產生工具限制
允許介面類定義的繼承關係,但會合并層次關係。
允許但忽略介面類中定義變數。
允許但忽略介面類中的方法聲明拋出異常。
一個源檔案中只能包含一個介面類的定義,不能包含其它類(內部類、匿名類等)的定義。
介面類定義本身和其引用到的類型必須為內部支援資料類或可以從源碼獲得定義。
使用者定義實體類規範
field 定義
不可以引用:
枚舉類型
除上文提到的 Map、List、Set 之外的泛型
抽象類別
介面類
原生類型的數組
可以引用:
具體的實體類,要求參考型別與實際的物件類型保持一致;不可使用父類參考型別指向子類對象。
內部支援資料類。數組、Map、List、Set 集合類型不可以嵌套,參見上文相關樣本。
修飾符包括 transient 的屬性將會被忽略。
final static int 定義的常量(其它不符合該要求定義的常量或靜態變數將被忽略)。
說明不推薦
is開頭的成員變數定義。
類的定義
可以繼承自其它實體類。
忽略其方法聲明,產生工具將會自動根據實體類欄位產生 setter/getter 方法。
代碼產生工具限制
屬性的聲明必須一行一個。
允許但忽略使用者定義實體類實現的介面。
一個源檔案中只能包含一個使用者定義實體類的定義,不能包含其它類(內部類、匿名類等)的定義。
介面類定義本身和其引用到的類型必須為內部支援資料類或可以從源碼獲得定義。