一、命名规范
1.包名的命名 包名全部小写,连续的单词直接连接,不出现特殊符号,不使用下划线,包名中不要出现很容易区分供应商的信息 参考示例: 一级包名为com 二级包名为skg 三级包名为应用名称:如launcher、weather等 四级包名为模块名或层级名:如工具类为util、Activity类为activity 例如:com.skg.launcher.activity
2.类的命名 采用大驼峰式命名法,每个单词的首字母大写。尽量避免缩写,除非该缩写是众所周知的,比如HTML,URL,如果类名称包含单词缩写,则单词缩写的每个字母均应大写。例外注意命令时,区分各个组件类型。 参考示例:MainMenuActivity、SoftwareUpdateService等
3.方法(函数)命名 使用动词或动名词,采用小驼峰命名法。 参考示例:onCreate();
4.接口命名 命名规则与类一样采用命名规则与类一样采用大驼峰命名法,多以able或ible结尾 参考示例:Runnable
5.变量命名 A.成员变量和临时变量命名:采用小驼峰命名法,第一个单词首字母小写其它单词首字母大写。 参考示例:private String userName; B.常量命名:常量使用全大写字母加下划线的方式命名,并且用final static修饰。 参考示例:private final static String TAG = “tag”; C.控件实例命名:采用小写字母加下划线方式命名,类中控件名称必须与xml布局id保持一致。 参考示例:android:id=”@+id/tv_pic_brightness_value”则对应调用的Activity中定义该控件为 private TextView tv_pic_brightness_value;
6.控件资源id命名 view缩写_模块名_view的逻辑名称。参考示例:tv_pic_brightness_value 常见View控件及其缩写如下: 7.res资源文件命名 A.布局文件命名规范:全部采用小写,采用下划线命名法。其中{module_name}为业务模块或功能模块等模块化的名称或简称。 activity layout:{module_name}activity{名称} 例如: channel_activity_programedit.xml
fragment layout:{module_name}fragment{名称} 例如: weather_fragment_cityset.xml
dialog layout:{module_name}dialog{名称} 例如: channel_dialog_rename.xml
list layout:{module_name}list{名称} 例如: channel_list_programeedit.xml
adapter layout:{module_name}item{名称} 例如: channel_item_programedit.xml
widget layout:{module_name}widget{名称} 例如: weather_widget_todayinfo.xml
B.图片文件命名规范 背景图片:{module_name}_名称_bg.png 图标:{module_name}_名称_icon.png
C.字符串和字符串数组命名规范 字符串:str_{module_name}名称 字符串数组:strarr{module_name}名称 其它资源如color、dimens等类似如上命名方式: 如color{module_name}_名称
二、代码编写风格
2.1方法和类的长度
为便于阅读和理解,单个函数的有效代码长度当尽量控制在 100 行以内(不包括注释行),当一个功能模块过大时往往造成阅读困难,因此当使用子函数等将相应功能抽取出来,这也有利于提高代码的重用度。 单个类也不宜过大,当出现此类情况时当将相应功能的代码重构到其他类中,通过组合等方式来调用,建议单个类的长度包括注释行不超过 1500 行。尽量避免使用大类和长方法。
2.2间隔问题
类、方法及功能块间等应以空行相隔,以增加可读性,但不得有无规则的大片空行。 操作符两端应当各空一个字符以增加可读性。相应独立的功能模块之间可使用注释行间隔,并标明相应内容。
2.3代码对齐问题
2.4 控制语句
判断中如有常量,则应将常量置与判断式的右侧。如:
if ( true == isAdmin())...
if ( null == user)...
尽量不使用三目条件判断。 所有 if 语句必须用{}包括起来,即便是只有一句:
2.5 循环调节
循环中必须有终止循环的条件或语句,避免死循环。当在 for 语句的初始化或更新子句中使用逗号时,避免因使用三个以上变量,而导致复杂度提高。若需要,可以在 for 循环之前(为初始化子句)或 for 循环末尾(为更新子句)使用单独的语句。因为循环条件在每次循环中多会执行一次,故尽量避免在其中调用耗时或费资源的操作,比较一下两种循环的差异:
2.6 异常的捕捉和处理
捕捉异常是为了处理它,不要捕捉了却什么都不处理而抛弃,最低限度当向控制台输出当前异常,如果你不想处理它,请将该异常抛给它的调用者,建议对每个捕捉到的异常都调用 printStackTrace()输出异常信息,避免因异常的湮没。多个异常应分别捕捉并处理,避免使用一个单一的 catch 来处理。如:
2.7 其他一些优化建议
2.7.1 成员变量权限
良好的程序设计应该尽可能减小类与类之间耦合,所遵循的经验法则是:尽量限制成员函数的可见性。如果成员函数没必要公有 (public),就定义为保护 (protected);没必要保护(protected),就定义为私有 (private) 1、 空格问题
if (true == hasMoney) {
} else {
}
如上if else运算符两端需要用空格隔开。
2、使用括号明确表示运算符的优先级,避免使用默认优先级。例如: if((a > b) && (c>d)) 不要写成 if(a > b && c > d)
3、不要出现无意义的字符或数字,如果需要使用数字,需要将其按照具体的功能定义为常量。
4、数组声明的时候采用int[] languageIndex;而不要采用int languageIndex[];
5、准确地确定成员函数的存取控制符号,不是必须使用public属性的,请使用protected,不是必须使用protected,请使用private。
6、if语句中判断语句的书写规范 变量和常量比较应该书写为“常量 == 变量”,主要是为了防止“ == ” 误写为“ = ”。
2.7.2 性能提升建议
2.7.2.1 String 与 StringBugffer
不要使用如下 String 初始化方法:
String str = new String(“abcdef”);
这将产生两个对象,应当直接赋值:
String str = “abcdef”;
在处理可变 String 的时候要尽量使用 StringBuffer 类,StringBuffer 类是构成 String类的基础。String 类将 StringBuffer 类封装了起来,(以花费更多时间为代价)为开发人员提供了一个安全的接口。当我们在构造字符串的时候,我们应该用 StringBuffer 来实现大部分的工作,当工作完成后将 StringBuffer 对象再转换为需要的 String 对象。比如:如果有一个字符串必须不断地在其后添加许多字符来完成构造,那么我们应该使用 StringBuffer 对象和她的append() 方法。如果我们用 String 对象代替 StringBuffer 对象的话,将会花费许多不必要的创建和释放对象的 CPU 时间。
2.7.2.2垃圾收集和资源释放
参考三个以上判断时,switch case效率高于if else: https://blog.csdn.net/MDZZOL/article/details/78790125 https://blog.csdn.net/csdn_aiyang/article/details/76619098
过多的if else 分句请将其转成 switch 语句或使用子函数。 switch case 的效率更高
2.7.2.3垃圾收集和资源释放
不要过分依赖 JVM 的垃圾收集机制,因为你无法预测和知道 JVM 在什么时候运行 GC。尽可能早的释放资源,不再使用的资源请立即释放。可能有异常的操作时必须在 try 的 finally 块中释放资源,如数据库连接、IO 操作等:
三、注释说明
3.1文件注释内容
版权说明、描述信息、生成日期、修改记录、作者、生成日期,格式如下: /**
- Copyright ? 2015ktc. All rights reserved.
- @Title: LogcatUtil.java
- @Description: 调试信息工具文件
- @author: shan.zhang
- @date: 2015-6-4
- @modifier:
- @version: V1.0
*/
3.2类和接口的注释
类功能描述、作者、生成日期 /**
- @ClassName: LogcatUtil
- @Description: 用于程序中调试信息输出的工具类
- @author: shan.zhang
- @date: 2015-6-4
*/
3.3方法注释
功能描述、输入参数、返回值 /** *
- @Title: getInstance
- @Description: 调试工具类实例获取方法
- @return: LogcatUtil
*/ public static LogcatUtil getInstance() { if(null == mLogcatUtil) { mLogcatUtil = new LogcatUtil(); } return mLogcatUtil; }
3.4成员变量、常量注释
对应的功能定义 /**
- 是否输出打印信息开关
- true:输出打印信息
- false:不输出打印信息
/ private final static boolean DEBUG_ENABLE = false; /* - 默认输出log信息的Tag标识
*/ private final static String DEBUG_TAG = “k_debug”;
|