業(yè)務接口定義規(guī)范
考慮到手機端開發(fā)環(huán)境的限制(尤其是 iOS 系統(tǒng)),以及保持接口定義的簡單,服務端在定義移動服務接口時,不能使用 Java 語法的全集。
接口定義規(guī)范涉及三類定義:
內(nèi)部支持數(shù)據(jù)類規(guī)范:已支持的 Java 原生類和包裝類。
用戶接口類規(guī)范:用戶定義的 interface,包含 API 調(diào)用的 method 聲明。
用戶定義實體類規(guī)范:用戶定義的實體 class(包含 field 聲明),接口類中 method 參數(shù)或返回值、其它用戶定義實體類將會引用到。
內(nèi)部支持數(shù)據(jù)類規(guī)范
不支持的數(shù)據(jù)類型
容器類型不能多層嵌套。
List 或 Map 必須有泛型信息。
List 或 Map 的泛型信息不能是 array 類型
不支持單字節(jié)(字節(jié)數(shù)據(jù) byte [] 是支持的)
不支持對象數(shù)組,請用 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; //不能為單字節(jié)
private Person[] personArray; //不支持對象數(shù)組,請用 List 代替
private String description; //屬性名不能為 description
}
支持的數(shù)據(jù)類型
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,但:必須使用類型參數(shù);不能使用其具體子類 以下簡稱 List
java.util.Map,但:必須使用類型參數(shù);不能使用其具體子類;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;
用戶接口類規(guī)范
method 的參數(shù)
不可以引用:
枚舉類型
除上文提到的 Map、List、Set 之外的泛型
抽象類
接口類
原生類型的數(shù)組
可以引用:
具體的實體類,要求引用類型與實際的對象類型保持一致;不可使用父類引用類型指向子類對象。
內(nèi)部支持數(shù)據(jù)類,但數(shù)組、Map、List、Set 這些集合類型不可以嵌套。
如下是錯誤示例:
Map<String,String[]>
Map<String,List<Person>>(Person為一個具體的實體類)
List<Map<String,Persion>>
List<Persion[]>
method 的返回值
不可以引用:
枚舉類型
除上文提到的 Map、List、Set 之外的泛型
抽象類
接口類
原生類型的數(shù)組
可以引用:
具體的數(shù)據(jù)類,要求引用類型與實際的對象類型保持一致;不可使用父類引用類型指向子類對象,例如,不能用 Object 引用指向其它對象。
重要如果父類為具體類,生成工具將檢查不出此類錯誤。
內(nèi)部支持的數(shù)據(jù)類見文章開頭定義。數(shù)組、Map、List、Set 集合類型不可以嵌套,參見上文相關示例。
method 的定義
使用
@OperationType
注解,未加此注解的方法將被生成工具忽略。method 不可 overloading。
代碼生成工具限制
允許接口類定義的繼承關系,但會合并層次關系。
允許但忽略接口類中定義變量。
允許但忽略接口類中的方法聲明拋出異常。
一個源文件中只能包含一個接口類的定義,不能包含其它類(內(nèi)部類、匿名類等)的定義。
接口類定義本身和其引用到的類型必須為內(nèi)部支持數(shù)據(jù)類或可以從源碼獲得定義。
用戶定義實體類規(guī)范
field 定義
不可以引用:
枚舉類型
除上文提到的 Map、List、Set 之外的泛型
抽象類
接口類
原生類型的數(shù)組
可以引用:
具體的實體類,要求引用類型與實際的對象類型保持一致;不可使用父類引用類型指向子類對象。
內(nèi)部支持數(shù)據(jù)類。數(shù)組、Map、List、Set 集合類型不可以嵌套,參見上文相關示例。
修飾符包括 transient 的屬性將會被忽略。
final static int 定義的常量(其它不符合該要求定義的常量或靜態(tài)變量將被忽略)。
說明不推薦
is
開頭的成員變量定義。
類的定義
可以繼承自其它實體類。
忽略其方法聲明,生成工具將會自動根據(jù)實體類字段生成 setter/getter 方法。
代碼生成工具限制
屬性的聲明必須一行一個。
允許但忽略用戶定義實體類實現(xiàn)的接口。
一個源文件中只能包含一個用戶定義實體類的定義,不能包含其它類(內(nèi)部類、匿名類等)的定義。
接口類定義本身和其引用到的類型必須為內(nèi)部支持數(shù)據(jù)類或可以從源碼獲得定義。