Android 代码规范

简介: 这份文档参考了 [Google Java 编程风格规范](google-styleguide.googlecode.com/svn/trunk/javaguide.html)和 [Google 官方 Android 编码风格规范](http://www.360sdn.com/2013/android

前言

这份文档参考了 Google Java 编程风格规范Google 官方 Android 编码风格规范。该文档仅供参考,只要形成一个统一的风格,见量知其意就可。

源文件基础

编码格式

源文件编码格式为 UTF-8。

文件名

源文件以其最顶层的类名来命名,大小写敏感,文件扩展名为.java。

源文件结构

许可证与版权信息

如果一个文件包含许可证或版权信息,那么它应当被放在文件最前面。

package语句

package 语句不换行,列限制(3.4节)并不适用于package语句。(即package语句写在一行里)

import语句

1、import不要使用通配符:

即,不要出现类似这样的import语句:import java.util.*;

2、不要换行:

import语句不换行,列限制(4.4节)并不适用于import语句。(每个import语句独立成行)

类成员区顺序

类成员顺序对代码的可读性是有很大帮助的,从上到下的排列顺序为:

常量区
UI控件变量区
普通变量区
重载方法区(重载,永不分离)
声明周期区(在生命周期区方法内加入需要执行的代码)

类成员划分

按照发生的先后顺序排列
常量按照使用先后排列
UI控件成员变量按照layout文件中的先后顺序排列
普通成员变量按照使用的先后顺序排列
方法基本上都按照调用的先后顺序在各自区块中排列

格式术语

大括号

1、使用大括号(即使是可选的)

大括号与if, else, for, do, while语句一起使用,即使只有一条语句(或是空),也应该把大括号写上。

2、非空块:K & R 风格

对于非空块和块状结构,大括号遵循 Kernighan 和 Ritchie 风格 (Egyptian brackets):

左大括号前不换行;
左大括号后换行;
右大括号前换行;
如果右大括号是一个语句、函数体或类的终止,则右大括号后换行; 否则不换行。

例如,如果右大括号后面是else或逗号,则不换行。
示例:

return new MyClass() {    
    @Override 
    public void method() {        
        if (condition()) {
            try {
                something();
            } catch (ProblemException e) {
                recover();
            }
        }
    }
};

空块:可以用简洁版本

一个空的块状结构里什么也不包含,大括号可以简洁地写成{},不需要换行。
例外:如果它是一个多块语句的一部分(if/else 或 try/catch/finally) ,即使大括号内没内容,右大括号也要换行。
示例:

void doNothing() {}

块缩进

每当开始一个新的块,缩进增加4个空格,当块结束时,缩进返回先前的缩进级别。缩进级别适用于代码和注释。(见3.1.2节中的代码示例)

一行一个语句

每个语句后要换行。

列限制

一个项目可以选择一行80个字符或100个字符的列限制,除了下述例外,任何一行如果超过这个字符数限制,必须自动换行。

空白

垂直空白

有且只有一个换行

类成员区划分
在方法体内,语句的逻辑分组间使用空行。
类的第一个成员与最后一个成员的空白。

水平空白

类型和变量之间:List list
分隔任何保留字与紧随其后的左括号(()(如if, for catch等)。
如果在一条语句后做注释,则双斜杠(//)两边都要空格。
在, : ;及右括号())后

具体结构

1、枚举类

枚举常量间用逗号隔开,换行可选。

private enum Suit { 
    CLUBS, 
    HEARTS, 
    SPADES, 
    DIAMONDS
}

2、变量声明

1)、每次只声明一个变量

不要使用组合声明,比如int a, b;

2)、需要时才声明,并尽快进行初始化

不要在一个代码块的开头把局部变量一次性都声明了(这是c语言的做法),而是在第一次需要使用它时才声明。 局部变量在声明时最好就进行初始化,或者声明后尽快进行初始化。

3、数组

1)、非C风格的数组声明

中括号是类型的一部分:String[] args, 而非 String args[]

4、switch语句

每个switch语句都包含一个default语句组,即使它什么代码也不包含。

5、注解(Annotations)

1)、方法注解

注解紧跟在文档块后面,应用于类、方法和构造函数,一个注解独占一行。

2)、变量注解

没有特殊限制,也可以写成:
@Partial @Mock DataLoader loader;

6、Modifiers(修饰)

类和成员的modifiers如果存在,则按Java语言规范中推荐的顺序出现。
public protected private abstract static final transient volatile synchronized native strictfp

命名规范

包名

包名全部小写,连续的单词只是简单地连接起来,不使用下划线。
例如:com.shuidi.huzhu

类名

类名都以UpperCamelCase风格编写,后缀类型,不要加下划线。
类名通常是名词或名词短语,接口名称有时可能是形容词或形容词短语。名词,采用大驼峰命名法,尽量避免缩写,除非该缩写是众所周知的, 比如HTML,URL,如果类名称中包含单词缩写,则单词缩写的每个字母均应大写。

WelcomeActivity、NewDetailAdapter、HomePosterParser、ThreadPoolManager等等

测试类的命名以它要测试的类的名称开始,以Test结束。
例如:HashTest 或 HashIntegrationTest。
接口(interface):命名规则与类一样采用大驼峰命名法,多以able或ible结尾,如
interface Runnable ;
interface Accessible;

方法名

方法名都以 LowerCamelCase 风格编写。
方法名通常是动词或动词短语。

初始化方法,命名以init开头,例:initView
按钮点击方法,命名以to开头,例:toLogin
设置方法,命名以set开头,例:setData
具有返回值的获取方法,命名以get开头,例:getData
通过异步加载数据的方法,命名以load开头,例:loadData
布尔型的判断方法,命名以is或has,或具有逻辑意义的单词如equals,例:isEmpty

常量名

全部为大写单词,单词之间用下划线分开。
public final static int PAGE_SIZE = 20;

参数名、变量名

1、控件类型

类型描述+{范围描述+}意义描述的组合,用驼峰式,首字母小
private TextView tvHeaderTitle; // 标题栏的标题
private Button btnLogin; // 登录按钮

2、其他类型

{范围描述+}意义描述+类型描述的组合,用驼峰式,首字母小
private ArrayList<String> commentList; 
private String content; 

资源文件命名

资源文件命名与java命名不同,大多采用前缀命名法,对类型进行区分

1、控件ID命名

<!-- 这是标题栏的标题 -->
<TextView
    android:id="@+id/txt_header_title"
    ... />

<!-- 这是登录按钮 -->
<Button
    android:id="@+id/btn_login"
    ... />

2、layout命名

组件类型{范围}功能,范围可选,只在有明确定义的范围内才需要加上。

activity_{范围_}功能,为Activity的命名格式 
fragment_{范围_}功能,为Fragment的命名格式
dialog_{范围_}功能,为Dialog的命名格式 
item_{范围_}功能,为列表的item命名格式
widget_{范围_}功能,为自定义控件类命名格式
header_{范围_}功能,为列表的HeaderView命名格式
footer_{范围_}功能,为列表的FooterView命名格式

3、string的命名

类型{范围}功能,范围可选。
传统命名方式:

页面标题,命名格式为:title_页面
按钮文字,命名格式为:btn_按钮事件
标签文字,命名格式为:label_标签文字
选项卡文字,命名格式为:tab_选项卡文字
消息框文字,命名格式为:toast_消息
编辑框的提示文字,命名格式为:hint_提示信息
图片的描述文字,命名格式为:desc_图片文字
对话框的文字,命名格式为:dialog_文字
menu的item文字,命名格式为:action_文字

建议命名方式:
String命名如果以传统命名法来命名,有些按照业务逻辑进行命名,好处是可插拔,坏处是资源命名满天飞,迭代周期久后导致过于臃肿,建议根据实际意义进行命名。

示例:

我的优惠券 :str_mine_coupon
支付 :str_pay

4、colors的命名
传统命名方式:
前缀{控件}{范围}{_后缀},控件、范围、后缀可选,但控件和范围至少要有一个。

背景颜色,添加bg前缀
文本颜色,添加text前缀
分割线颜色,添加div前缀
区分状态时,默认状态的颜色,添加normal后缀
区分状态时,按下时的颜色,添加pressed后缀
区分状态时,选中时的颜色,添加selected后缀
区分状态时,不可用时的颜色,添加disable后缀

建议命名方式:

由于色值复用较多,个人建议采用更为直接的匈牙利命名法,达到更直观,更简洁的使用

示例:

正常颜色 :col_000000
带透明度颜色 :col_000000_translucent25 

5、drawable的命名

前缀{控件}{范围}{_后缀},控件、范围、后缀可选,但控件和范围至少要有一个。

图标类,添加ic前缀
背景类,添加bg前缀
分隔类,添加div前缀
默认类,添加def前缀
区分状态时,默认状态,添加normal后缀
区分状态时,按下时的状态,添加pressed后缀
区分状态时,选中时的状态,添加selected后缀
区分状态时,不可用时的状态,添加disable后缀
多种状态的,添加selector后缀(一般为ListView的selector或按钮的selector)

6、动画文件命名

动画类型_动画方向。

fade_in,淡入
fade_out,淡出
push_down_in,从下方推入
push_down_out,从下方推出
slide_in_from_top,从头部滑动进入
zoom_enter,变形进入
shrink_to_middle,中间缩小

附录:

1、 UI控件缩写表 : 建议控件的命名以前缀命名

LinearLayout     ll     llFriend
RelativeLayout     rl     rlMessage
FrameLayout     fl     flCart
TableLayout     tl     tlTab
Button         btn     btnHome
ImageButton     ibtn     btnPlay
TextView     tv     tvName
EditText     et     etName
ListView     lv     lvCart
RecycleView     rv     rvTopic
ImageView     iv     ivHead
GridView     gv     gvPhoto

2、常见英文单词缩写表

icon         ic 
color         col
divider     di
selector     sl
average     avg
background     bg
buffer         buf
control     ctrl
delete         del
document     doc
error         err
escape         esc
increment     inc
infomation     info
initial     init
image         img
length         len
library     lib
message     msg
password     pwd
position     pos
server         srv
source        src
string         str
temp         tmp
window         win
目录
相关文章
|
1月前
|
Ubuntu 网络协议 Java
【Android平板编程】远程Ubuntu服务器code-server编程写代码
【Android平板编程】远程Ubuntu服务器code-server编程写代码
|
3月前
|
人工智能 IDE 开发工具
Studio Bot - 让 AI 帮我写 Android 代码
Studio Bot - 让 AI 帮我写 Android 代码
152 1
|
9月前
|
IDE 数据可视化 Java
Android自动生成代码,可视化脚手架之基础信息配置
今天的内容比较简单,大致过一下Electron一些基本用法,虽然说这些比较简单,但又是不得不去了解的,正如做Android的我们,也不是一上来就会的,需要一个循序渐进的过程,下一章,我们再去实际的开发功能。
129 0
|
2月前
|
Ubuntu 网络协议 Linux
【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发
【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发
48 0
|
3月前
|
安全 算法 JavaScript
安卓逆向 -- 关键代码定位与分析技术
安卓逆向 -- 关键代码定位与分析技术
38 0
|
3月前
|
安全 Android开发 数据安全/隐私保护
代码安全之代码混淆及加固(Android)
代码安全之代码混淆及加固(Android)
40 0
|
4月前
|
安全 Java Android开发
Android App开发之安全加固中反编译、代码混淆、第三方加固以及重签名的讲解及实战(图文解释 简单易懂)
Android App开发之安全加固中反编译、代码混淆、第三方加固以及重签名的讲解及实战(图文解释 简单易懂)
70 0
|
6月前
|
XML Java Android开发
Android 解决使用CocosCreator开发产品上架应用市场代码重复问题
Android 解决使用CocosCreator开发产品上架应用市场代码重复问题
271 0
|
7月前
|
JSON dexposed Java
一文总结 Android 隐私合规代码思路
一文总结 Android 隐私合规代码思路
|
7月前
|
SQL 程序员 Android开发
一行代码,利用 android studio自带的 liveTemplate 快速生成单例模式,程序员偷懒神器
一行代码,利用 android studio自带的 liveTemplate 快速生成单例模式,程序员偷懒神器