Java&Android代码规范
----------------------Java规范----------------------
源文件结构
1. package语句
2. import语句
3. Java Doc
类声明
1. 只有一个顶级类
2. 命名(包名、类名最好不要用复数)
包/类或接口/方法
- 包名: 全部小写,用”.”(点)分开,不允许复数
例如:com.util 而不能com.utils
- 类: 单个单词, 首字母大写
例如: Constant,多个单词, 每个单词的首字母大写, 例如: WatchVideoActivity
- 方法: 单个单词, 全部小写
例如: main() 多个单词, 从第二个单词开始, 每个单词的首字母大写,如setPersonalData()
- 接口:I开头或不以I开头。若接口有实现,则必须加I。若接口用于保存常量,则不必加I。
例如:IAdapter表示适配器接口有功能实现。
ActReqResult表示返回值接口,定义一下返回值常量。
成员变量/局部变量/静态成员变量/常量
-
成员变量: 小驼峰命名法 如Button sBackButton
-
静态成员变量: 大驼峰命名法 如String mPageNum
-
局部变量: 小驼峰命名法
-
常量: 全部大写, 每个单词用”_”(下划线)隔开, (如MAX_SIZE)
格式
1. 大括号
空块或一行代码
大括号与if, else,while等语句一起使用。若代码块为空,可以采用简洁的书写方式。
示例:
void doNothing() {} //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. 块缩进
每当开始一个新的块,缩进增加四个空格或一个tab,当块结束时,缩进返回先前的缩进级别。缩进级别适用于代码和注释。
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);
break;
}
6. 注释
块注释与其周围的代码在同一缩进级别。它们可以是/.../风格,也可以是//...风格。对于多行的/.../注释,后续行必须从开始, 并且与前一行的对齐。
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);
3. 静态成员:使用类进行调用
使用类名调用静态的类成员,而不是具体某个对象或表达式。
Foo foo = ...;
Foo.staticMethod(); // good
foo.staticMethod(); // bad
somethingThatYieldsAFoo().staticMethod(); // very bad
4. Finalizers: 禁用
极少会去重写Object.finalize。
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标记
标准的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
- icon_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; //私有变量
--------------------------后记--------------------------
几条小建议:
1. Activity的类名与layout的命名统一, 如ShareHouseListActivity--activity_share_house_list
2. View变量名与Layout的ViewId统一, 如tvShareHouse--tv_share_house
- activity中在一个View.OnClickListener中处理所有的逻辑
4. 方法放置顺序尽量按照调用的顺序
参考:
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