Android 代码规范
文件结构
-
【强制】 源文件应以其最顶层的类名来命名,区分大小写,文件扩展名为
.java
[1]。 -
【强制】 一个源文件应包含[1]:
说明:按顺序,每个部分之间用一个空行隔开。
-
许可证或版权信息(如有需要);
-
package
语句; -
import
语句; -
一个顶级类(仅有一个).
-
-
【强制】 许可证和版权信息应放在文件的最前面[1]
规范1-3正确示例
/** * Copyright (C),2002-2018, 苏宁软件技术有限公司 * Author: 边涛 * Date: 2018年7月15日 下午2:16:23 * Description: 测试文件 */ package com.bt.hub.myhub; import android.app.Activity; import android.os.Bundle; public class TestActivity extends Activity{ ... }
-
【强制】
package
语句应写在一行不换行,列限制不适用于package
语句[1] -
. 【强制】
import
语句应写在一行不换行,列限制不适用于import
语句[1]。 -
【强制】
import
语句不使用通配符[1]规范4-6示例
// 反例 import com.bt.hub.myhub. Carousel.adapter.CarouselAdapter; import com.bt.hub.myhub. Carousel.view.CarouselView; import com.bt.hub.myhub.R; import java.util.*; // 正例 import com.bt.hub.myhub.Carousel.adapter.CarouselAdapter; import com.bt.hub.myhub.Carousel.view.CarouselView; import com.bt.hub.myhub.R; import java.util.ArrayList; import java.util.List;
-
【强制】
import
语句可以分为以下几组[1]:说明:按顺序,每个部分之间用一个空行隔开,所有的静态导入独立成组,每个顶级包为一组,组内不空行,按字典序排列。
com.google
的包(仅当这个源文件是在com.google
包下);- 第三方的包,例如:android / com / junit / org / sun / suning;
- java / javax的包。
规范正确示例
// 包名 package com.suning.mobile.epa.zxing.encoding; // com.google的包 import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; // android包 import android.graphics.Bitmap; // java包 import java.util.Hashtable; import java.util.ArrayList;
-
【强制】 类声明每个顶级类都在一个与它同名的源文件中(当然,还包含
.java
后缀)[1]。 -
【强制】 每个类应该以某种逻辑去排序它的成员,维护者应该要能解释这种排序逻辑[1]。
说明:类的成员顺序对程序易读性有很大的影响,但这也不存在唯一的通用法则。不同的类对成员的排序可能是不同的。新的成员不能总是习惯性地依次添加到前者后面,因为这样就是按时间顺序而非某种逻辑来排序的。
-
【强制】 建议使用注释将源文件分为明显的区块,区块划分如下:
说明:对源文件进行分区,可以方便快捷的进行代码定位,提高阅读效率。
- 内部接口声明区;
- 常量声明区;
- UI 控件成员变量声明区;
- 普通成员变量声明区;
- 接口实现区;
- 控件响应事件实现区;
- 构造方法区;
- 初始化相关方法区;
- 普通逻辑方法区;
- 重载逻辑方法区;
- 发起异步任务方法区;
- 异步任务回调方法区;
- 生命周期回调方法区;
get
/set
方法区;- 内部类声明区。
-
【强制】 类成员组织通用规则[1]:
- 按照发生的先后顺序排列;
- 常量按照使用先后排列;
- UI 控件成员变量按照
layout
布局文件的先后顺序排列; - 通成员变量按照使用的先后顺序排列;
- 方法按照调用的先后顺序,在各自区块中排列;
- 相关功能作为小区块放在一起(或者封装掉)。
-
【强制】 重载永不分离[1]。
说明:当一个类有多个构造函数,或是多个同名方法,这些函数/方法应该按顺序出现在一起,中间不要放进其它函数/方法。
规范9-12正确示例:
public class CarouselMainActivity extends Activity implements View.OnClickListener { /* * 常量 * / private static final String TAG = "CarouselMainActivity"; /* * UI变量 * / private CarouselView mCarouselView; private CarouselAdapter mCarouselAdapter; /* * 普通 * / private List<Page> mModel = new ArrayList<>(); /* * 生命周期 * / @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.carousel_main_layout); initView(); initData(4); } @Override protected void onResume() {...} /* * 自定义方法 * / private void initView() {...} private void initData(int num) {...} /* * 接口实现 * / @Override public void onClick(View v) {...} /* * 内部类 * / public class Page {...} }
命名风格
通用规则
-
【强制】 代码中的命名均不能以下划线
_
或美元符号$
开始,也不能以下划线_
或美元符号$
结束[2] 。规范错误示例
// 反例 private String _name; private String __name; private String name_; private String $Object; private String name$; private String Object$;
-
【强制】 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式[2] 。
说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免采用。
规范示例
// 国际通用的命名,例如suning/nanjing等可以使用拼音 public String suningName = "suning"; public String nanjingName = "nanjing"; // 反例,用于表示圆点是否显示 public String dianShow; public String dianHide; // 正例,必须使用英文 public String dotShow;public String dotHide;
-
【推荐】 如果模块、接口、类、方法使用了设计模式,在命名时要体现出具体模式[2]
说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计理念。
规范正确示例
public