Android代码规范
Java&Android代码规范
----------------------Java规范----------------------
源文件结构
1. Java Doc
2. package语句
3. import语句
类声明
1. 只有一个顶级类
2. 命名(包名、类名最好不要用复数)
包/类或接口/方法
1) 包名: 全部小写,用”.”(点)分开,不允许复数
例如: com.example.ImageUtil,不要com.example.ImageUtils
2) 类或接口: 单个单词, 首字母大写,
例如: Constant,多个单词, 每个单词的首字母大写, 例如: WatchVideoActivity
3) 方法: 单个单词, 全部小写,
例如: main() 多个单词, 从第二个单词开始, 每个单词的首字母大写,如setPersonalData()
成员变量/局部变量/静态成员变量/常量
1) 成员变量: 小驼峰命名法 如Button backButton
2) 静态成员变量: 大驼峰命名法 如String PageNum
3) 局部变量: 小驼峰命名法
4) 常量: 全部大写, 每个单词用”_”(下划线)隔开, (如MAX_SIZE)
格式
1. 大括号
空块或一行代码
大括号与if, else,while等语句一起使用。若代码块为空或只有一行,可以采用简洁的书写方式。
示例:
void doNothing() {} //good
if(condition){
doTest();
} // good
if(condition) doTest(); //good
if(condition)
doTest(); //bad
非空块:K & R 风格
示例:
return new MyClass() {
@Override public void method() {
if (condition()) {
try {
something();
} catch (ProblemException e) {
recover();
}
}
}
};
2. 块缩进
每当开始一个新的块,缩进增加2个空格,当块结束时,缩进返回先前的缩进级别。缩进级别适用于代码和注释。(见4.1.2节中的代码示例)
3. 列限制
一个项目可以选择一行100个字符的列限制,任何一行如果超过这个字符数限制,必须自动换行。
4. 变量声明
每次只声明一个变量
不要使用组合声明,比如int a, b;
变量在使用时初始化
不要在一个代码块的开头把局部变量一次性都声明了(这是c语言的做法),而是在第一次需要使用它时才声明。 局部变量在声明时最好就进行初始化,或者声明后尽快进行初始化。
数组初始化写成块状结构
示例:
int[] indexs = new int[] { 0, 1, 2, 3 }
5. switch语句
default必须写
即使default中无代码,也要写明default
Fall-through:注释
在一个switch块内,每个语句组要么通过break, continue, return
或抛出异常来终止,要么通过一条注释来说明程序将继续执行到下一个语句组, 任何能表达这个意思的注释都是OK的(典型的是用//fall through
)。这个特殊的注释并不需要在最后一个语句组(一般是default
)中出现。
示例:
switch (input) {
case 1:
case 2:
prepareOneOrTwo();
// fall through
case 3:
handleOneTwoOrThree();
break;
default:
handleLargeNumber(input);
}
6. 注释
块注释与其周围的代码在同一缩进级别。它们可以是/*...*/风格,也可以是//...风格。对于多行的/*...*/注释,后续行必须从*开始, 并且与前一行的*对齐。以下示例注释都OK。
示例:
/*
* This is // And so /* Or you can
* okay. // is this. * even do this. */
*/
7. Modifiers
类和成员的modifiers如果存在,则按Java语言规范中推荐的顺序出现。
示例:
public protected private abstract static final transient volatile synchronized native strictfp
编程实践
1. @Override:能用则用
只要是合法的,就把@Override
注解给用上。
2. 捕获的异常:不能忽视
打印异常,如果没有内容,请加注释,
示例:
try {
int i = Integer.parseInt(response);
return handleNumericResponse(i);
} catch (NumberFormatException ok) {
// it's not numeric; that's fine, just continue
}
return handleTextResponse(response);
一次只抛出一个异常
示例:
try {
printName.invoke(son, null);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} //good
try {
printName.invoke(son,null);
} catch (Exception e) {
e.printStackTrace();
} //bad
3. 静态成员:使用类进行调用
使用类名调用静态的类成员,而不是具体某个对象或表达式。
Foo foo = ...;
Foo.staticMethod(); // good
foo.staticMethod(); // bad
somethingThatYieldsAFoo().staticMethod(); // very bad
4. Finalizers: 禁用
极少会去重写Object.finalize
。
Tip:不要使用finalize。如果你非要使用它,请先仔细阅读和理解Effective Java 第7条款:“Avoid Finalizers”,然后不要使用它。
JavaDoc
1. 格式
类
/**
* Created by username on 2017/1/1
*/
方法
1. 多行注释
/**
* Multiple lines of Javadoc text are written here,
* wrapped normally...
*/
public int method(String p1) { ... }
2. 单行注释
/** An especially short bit of Javadoc. */
段落
空行(只包含最左侧星号的行)会出现在段落之间和Javadoc标记(@XXX)之前(如果有的话)。 除了第一个段落,每个段落第一个单词前都有标签<p>,并且它和第一个单词间没有空格。
Javadoc标记
标准的Javadoc标记按以下顺序出现:@param
, @return
, @throws
, @deprecated
, 前面这4种标记如果出现,描述都不能为空。 当描述无法在一行中容纳,连续行需要至少再缩进4个空格。
2. 内容
类、接口注释:说明类与接口的功能
方法注释:说明方法的功能,以下情况必须添加注释
- 接口中定义的所有方法
- 抽象类中自定义的抽象方法
- 抽象父类的自定义公用方法
- 工具类的公用方法
- 一些自一眼无法明白的方法
成员变量和常量注释:说明变量或常量代表的意义,以下情况必须添加注释
- 接口中定义的所有常量
- 公有类的公有常量
- 枚举类定义的所有枚举常量
- 实体类的所有属性变量
----------------------Android规范----------------------
命名规范
1. Activity/Fragment/View/数据库/控件名/组件名类名命名
- Activity: 逻辑名称 + Activity, 例如: LoginActivity
- Fragment: 逻辑名称 + Fragment, 例如: LoginFragment
- View: 逻辑名称 + View, 例如: LoginButton
- Database: 逻辑名称 + DB, 例如: SearchDB
- BroadcastReceiver: 逻辑名称 + Receiver, 例如: LoginSuccessExistReceiver
2. 方法命名:动词或动名词,采用小驼峰命名法,如onCreate(), onRun()
方法 | 说明 |
---|---|
initXX() | 初始化相关方法,使用init为前缀标志 |
isXX() | 返回为boolean值方法 |
getXX() | 返回某个值的方法,使用get为前缀标识 |
processXX() | 处理数据方法,使用process为前缀标识 |
displayXX() | 弹出提示框和提示信息,使用display为前缀标识 |
saveXX() | 与保存数据相关的,使用save为前缀标识 |
resetXX() | 对数据重组的,使用reset前缀标识 |
clearXX() | 清除数据相关的 |
removeXX() | 清除数据相关的 |
drawXXX() | 绘制数据或效果相关的,使用draw前缀标识 |
3. Layout命名:
全部小写, 用”_”(下划线)隔开
- Activity: activity + “_” + 逻辑名称
- Fragment: fragment + “_” + 逻辑名称
- Dialog: dialog + “_” + 逻辑名称
- Item: item+ “_” + 逻辑名称
- PopuWindow: popuWindow+ “_” + 逻辑名称
- Layout: layout+"_"+功能名
Layout中控件id命名: View的缩写 + “” + (模块名称 + “” +) View的逻辑名称, (全部小写)
- ImageView iv_title_back;
- TextView tv_edit_proson_info
- FramenLayout fl_mypage_container
- ReLativeLayout rl_watch_root
- ImageView iv_menu_myhead
View的缩写参考详情如下:
- LinearLayout: ll
- RelativeLayout: rl
- FramenLayout: fl
- TextView: tv
- ImageView: iv
- ImageButton: ib
- Button: btn
4. 颜色命名
颜色命名: 常用的容易辨认的颜色用颜色命名
<color name="color_white">#FFFFFF</color>
色值命名: 不常用的颜色
<color name="color_C7C7C7">#C7C7C7</color>
5. Drawable文件名命名
前缀 + ““ +逻辑名称 + (“” + 状态或用途), 全部小写, 前缀:图标--ic 图片--pic 背景--bg
- ic_im_share_house.png
- pic_im_guide_page.png
- bg_empty.png
6. Drawable资源文件命名
选择器:selector+ (模块名称) + “_” + 逻辑名称 (全部小写)
- selector_im_share_house
图形: “shape” + (模块名称)+ “” + 逻辑名称 (全部小写)
- shape_setting_item_norml.xml
- shape_setting_item_selected.xml
成员顺序
一般来说不同的类成员排序可能不同,但考虑到代码的可读性,维护者应该维护一种逻辑去排序他的成员。
变量:常量>静态变量>普通变量
示例:
public static final int PI = 3.14; //常量
public static int index = 1; //静态变量
public int x = 1; //共有变量
private int y = 1; //私有变量
方法:供外部调用的方法用public,需要被重写的方法使用protected,否则使用private,不接受没有修饰符的方法。
1)重载方法永不分离
2)方法尽量按照调用顺序放置
示例:
public void onCreate(Bundle bundle){
a();
b();
c();
}
private void a();
private void b();
private void c();//类方法按照调用顺序放置
public void onActivityForResult(){ //该方法放在类的后面
//do result operation
}
3)静态方法放在类的最后
逻辑代码放在前面,非逻辑代码放在后面。
--------------------------后记--------------------------
几条小建议:
1. Activity的类名与layout的命名统一, 如ShareHouseListActivity--activity_share_house_list
2. View变量名与Layout的ViewId统一, 如tvShareHouse--tv_share_house
3. activity中在一个View.OnClickListener中处理所有的逻辑
4. TODO
参考:
http://blog.csdn.net/wwj_748/article/details/42347283
http://source.android.com/source/code-style.html
http://blog.csdn.net/h3c4lenovo/article/details/7917293
http://blog.csdn.net/vipzjyno1/article/details/23542617
http://www.androidchina.net/2141.html
https://www.gitbook.com/book/shibin/android-codeformat/details
http://www.hawstein.com/posts/google-java-style.html
https://segmentfault.com/a/1190000005893399