Android Java类编写规范+优化建议
本文仅是我个人在实际开发中习惯的编写方式,当然这种方式也是来自很多官方的推荐,所以在一定程度上是可以被模仿套用的。本文将不定期更新~
零、指导原则
优先保证可读性,不要过分追求代码艺术和效率
在可读性和代码效率方面,请选择可读性。为了可读性我宁可多建立一个对象,或者是多写一个方法。当然,如果这段代码是执行频次很高的代码,那么请在编码后再进行优化。
追求模块化和开闭原则
一个类里可以写多个方法,但不要为了调用方便而肆意定义全局变量。宁可多些几个方法的参数也不要随便定义全局变量。定义全局变量首先会让可读性变差,阅读会到处跳转到找到这个变量的定义,而且不能很好的进行方法的开闭。其次,全局变量比局部变量更占内存,更不易被回收。
一、编码规范
使用特殊转义序列而不是它的八进制
我们应该用特殊的转移序列,比如:(\b, \t, \n, \f, \r, \”, \’及\),而不是它们对应的八进制,比如:\012
大胆使用非ASCII字符
如果我们在实际中需要用到非ASCII字符,我们当然可以去查表得到他们的转义码,但是没有必要。你可以大胆的在代码中这么写,或者加上注释。应为这样很便于阅读。
String unitAbbrev = "μs";
import不要使用通配符
不要出现类似这样的import语句:import java.util.*;
不要忽略大括号
大括号与if, else, for, do, while语句一起使用,即使只有一条语句(或是空),也应该把大括号写上。
什么时候换行
对于非空块和块状结构,大括号遵循Kernighan和Ritchie风格
(Egyptian brackets):
- 左大括号前不换行
- 左大括号后换行
- 右大括号前换行
- 如果右大括号是一个语句、函数体或类的终止,则右大括号后换行; 否则不换行。例如,如果右大括号后面是else或逗号,则不换行。
boolean isShow = true;
if (isShow) { } else { }
截断代码换行
如果一行代码太长了,那么可能会需要换行。这时候换行的原则是:在“非赋值运算符”处断开。下面是几个例子:
“+”在下一行
String url = "http://blog.isming.me/2014/10/27/"
+ "google-java-style/";
“&”在下一行
if (changed == true
& show == true) { }
“."在下一行
Logger
.init(YOUR_TAG) // default PRETTYLOGGER or use just init()
.setMethodCount(3) // default 2
.hideThreadInfo() // default shown
.setLogLevel(LogLevel.NONE); // default LogLevel.FULL
变量声明
每次只声明一个变量,不要:int a,b;
推荐下面的方式:
int a;
int b;
数组中的中括号
中括号应该是类型的一部分,不要按照C++的方式来写,而且中括号和左边不要有空格。应该像下面这样:
int[] d
Switch-case中的default
每个switch语句都包含一个default语句组,即使它什么代码也不包含。
Switch-case中的break
如果你的上一个判断和下个判断需要执行的代码是一致的,那么你可以不用break,但必须在原来break的地方加上注释。
switch (input) {
case 1:
case 2:
prepareOneOrTwo();
// break;
// fall through
case 3:
handleOneTwoOrThree();
break;
default:
handleLargeNumber(input);
}
限定符的顺序
我们的变量或方法可能有多个限定符,比如public,static什么的,那么请按照如下的顺序进行编写。
public protected private abstract static final transient volatile synchronized native strictfp
eg:
public static final String TAG;
包名的取法
包名全部小写,连续的单词只是简单地连接起来,不能使用下划线。
类名
类名通常是名词或名词短语,接口名称有时可能是形容词或形容词短语。
抽象类
以Abstract开头
例:AbstractDataManager
接口
以I开头,比如:IPointView
方法名
方法名通常是动词或动词短语。
异常
一般情况下捕获的异常都是需要打印出log的,但有些异常是我们在已知的,或者在这里出现异常是必然的化,我们可以不加捕获,但需要添加注释。
如果一个捕获的异常被命名为expected,则它可以被不加注释地忽略。下面是一种非常常见的情形,用以确保所测试的方法会抛出一个期望中的异常,
因此在这里就没有必要加注释。
try {
emptyStack.pop();
fail();
} catch (NoSuchElementException expected) {
}
Javadoc标记
标准的Javadoc标记按以下顺序出现:@param, @return, @throws, @deprecated, 前面这4种标记如果出现,描述都不能为空。
当描述无法在一行中容纳,连续行需要至少再缩进4个空格。
/**
* Adds a {@link Fragment} to this activity's layout.
*
* @param containerViewId The container view to where add the
* fragment.(换行得有缩进)
*
* @param fragment The fragment to be added.
*/
除了第一个段落,每个段落第一个单词前都有标签<p>,并且它和第一个单词间没有空格。
Intent中的key
从A跳转到B时,需要将intent中的key定义在B这个activity的内部,而不是全局的一个key文件中。这样确保传过去的key不会出现问题,适用于多入口的情况。
public class BActivity extends Activity{
public static final String KEY_USERNAME = "USER_NAME";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String username = getIntent().getStringExtra(KEY_USERNAME);
}
}
方法体尽可能独立
写方法的时候不要为了引用简单而去定义一堆类变量,尽可能的和方法外部独立,多写几个形参都是可以的。这样即使删掉一些类变量,也不会影响到具体方法的实现。
错误的写法:
String username = "jack";
/**
* 应用了类变量(不好)
*/
private void updateUsername() {
username = "tony";
}
正确的写法:
/**
* 独立性强,外界对内部完全没有任何影响
*/
private String updateUsername(String username) {
username = "tony";
return username;
}
id命名
linearLayout = ll
RelativeLayout = rl
GridLayout = gl
TextView = tv
ImageView = iv
ImageButton = ib
Button = btn
ScrollView = sv
EditText = et
CheckBox = cb
ProgressBar = pb
Activity命名
XxxActivity - xxx_activity
XxxFragment - xxx_header_fragment
XxxItem - xxx_item
数字、字母全部全角化
用animation-list做动画
用StringBuffer来做拼接字符串
我们尽量不用string来进行字符串拼接,都用stringBuffer来代替。如果你需要通过一个方法来返回一个String对象,并且你知道得到的字符串最终是要进行拼接的,那么请将返回的对象从String改为StringBuffer。比如:
private StringBuffer getString() {
return new StringBuffer("This is a string");
}
不多建立对象,经可能复用现有的对象
当从输入的数据集中抽取出Strings的时候,尝试返回原数据的substring对象,而不是创建一个重复的对象。
尽可能使用简单对象
一组int数据要比一组Integer对象要好很多。可以得知,两组1维数组要比一个2维数组更加的有效率。同样的,这个道理可以推广至其他原始数据类型。
如果你需要实现一个数组用来存放(Foo,Bar)的对象,尝试分解为Foo[]与Bar[]要比(Foo,Bar)好很多。(当然,为了某些好的API的设计,可以适当做一些妥协。但是在自己的代码内部,你应该多多使用分解后的容易。
恰当的使用static
我个人不是很喜欢用static关键字,因为当你的方法或者是变量被static标识了后,只要别的地方碰到了你的这个类,所有static的方法/变量都会被产生。因此在类的内部尽量不要用static。如果你这个方法是工具方法,或者某个常量是要被其他类引用的,那么请将其设置为static,这样方法调用将快15%-20%。这是一个好的习惯,因为你可以从方法声明中得知调用无法改变这个对象的状态。
常量声明为staic final
先看下面这种声明的方式:
static int intVal = 42;
static String strVal = "Hello, world!";
编译器会在类首次被使用到的时候,使用初始化方法来初始化上面的值,之后访问的时候会需要先到它那里查找,然后才返回数据。我们可以使用static final来提升性能:
static final int intVal = 42;
static final String strVal = "Hello, world!";
这时再也不需要上面的那个方法来做多余的查找动作了。 所以,请尽可能的为常量声明为static final类型的。
尽量使用增强型for循环
增强型for循环会让遍历更高效,但是需要注意:
对于ArrayList这种集合,自己手写的循环要比增强型for循环更快,而其他的集合就没有这种情况。因此,对于我们来说,默认情况下可以都使用增强型for循环,而遍历ArrayList时就还是使用传统的循环方式吧。在JAVA8中统一使用foreach做循环。
for (int i = 0; i < mArray.length; ++i) {
sum += mArray[i].mSplat;
}
尽量不要用内部类访问外部类的私有成员
虽然内部类是可以访问外部类的私有成员的(如一个变量),但这样效率会很低。你可以把内部类需要访问的域和方法声明为包级访问,而不是私有访问权限。不幸的是,这意味着在相同包中的其他类也可以直接访问这些域,所以在公开的API中你不能这样做。
public class Foo {
private class Inner {
void stuff() {
Foo.this.doStuff(Foo.this.mValue);
}
}
private int mValue;
private void doStuff(int value) {
System.out.println("Value is " + value);
}
}
能不用float就不用
Android系统中float类型的数据存取速度是int类型的一半,尽量优先采用int类型。
在列表滑动时不加载图片
当SCROLL_STATE_FLING时停止异步加载
采用view组件复用,而不是布局页面复用
很多页面只有一两个元素不同,但我们不应该去做页面的复用,利用逻辑来控制某些控件的可见性是不可取的。应该找到共同的组件,利用fragment和其他方案来进行组件的组合。而不是强制复用layout文件,强制复用会带来后期维护的困难。
Android Java类编写规范+优化建议的更多相关文章
- (转)Java代码书写规范
0. 安装阿里代码规范的eclipse插件 https://www.cnblogs.com/caer/p/7753522.html 1.基本原则 强制性原则: 1.字符串的拼加操作,必须使用S ...
- 对Android开发者有益的40条优化建议
下面是开始Android编程的好方法: 找一些与你想做事情类似的代码 调整它,尝试让它做你像做的事情 经历问题 使用StackOverflow解决问题 对每个你像添加的特征重复上述过程.这种方法能够激 ...
- 对 Android 开发者有益的 40 条优化建议
本文转载于:http://www.oschina.net/translate/40-developer-tips-for-android-optimization?cmp 下面是开始Android编程 ...
- 【转】对Android开发者有益的40条优化建议
下面是开始Android编程的好方法: 找一些与你想做事情类似的代码 调整它,尝试让它做你像做的事情 经历问题 使用StackOverflow解决问题 对每个你像添加的特征重复上述过程.这种方法能够激 ...
- [转]对Android开发者有益的40条优化建议
下面是开始Android编程的好方法: 找一些与你想做事情类似的代码 调整它,尝试让它做你像做的事情 经历问题 使用StackOverflow解决问题 对每个你像添加的特征重复上述过程.这种方法能够激 ...
- android应用的优化建议(转载)
首先,这是我在http://www.oschina.net/translate/40-developer-tips-for-android-optimization看到的一片文章,感觉挺有道理的,所以 ...
- 对Android 开发者有益的 40 条优化建议(转)
下面是开始Android编程的好方法: 找一些与你想做事情类似的代码 调整它,尝试让它做你像做的事情 经历问题 使用StackOverflow解决问题 对每个你像添加的特征重复上述过程.这种方法能够激 ...
- 我的Android进阶之旅------>对Android开发者有益的40条优化建议
下面是开始Android编程的好方法: 找一些与你想做事情类似的代码 调整它,尝试让它做你像做的事情 经历问题 使用StackOverflow解决问题 对每个你像添加的特征重复上述过程.这种方法能够激 ...
- Android代码内存优化建议-OnTrimMemory优化
原文 http://androidperformance.com/2015/07/20/Android代码内存优化建议-OnTrimMemory优化/ OnTrimMemory 回调是 Androi ...
随机推荐
- easyui filebox 浏览图片
<img id="image1"/> <input id="f1" class="easyui-filebox" name ...
- Linux高级编程--06.进程概述
进程控制块 在Linux中,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,它通常包含如下信息: 进程id.系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非 ...
- JS基础回顾,小练习(判断数组,以及函数)
追梦子博客版权所有. // 判断arr是否为一个数组,返回一个bool值 方法1: function isArray(arr) { var str = arr.__proto__.constructo ...
- js数组冒泡排序,快速排序的原理以及实现
冒泡排序: 随便从数组中拿一位数和后一位比较,如果是想从小到大排序,那么就把小的那一位放到前面,大的放在后面,简单来说就是交换它们的位置,如此反复的交换位置就可以得到排序的效果. var arr = ...
- 【转载】Linux下动态共享库加载时的搜索路径详解
转载自:http://www.eefocus.com/article/09-04/71617s.html 对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似“error while loading ...
- 用emacs的org2blog组件写cnblogs博客 -- 环境配置及使用
Table of Contents 配置 使用 创建一篇博文并发布 更新一篇博文 删除一篇博文 待办 本文给出了一个安装.配置org2blog的方法,实现在emacs中书写blog文章.并发布到cnb ...
- 服务器唯一id生成规则
在使用hashCode的时候,发现会出现相同id,虽然几率很小.虽然发现并不是hashCode的原因,而是其他逻辑的问题. 但是还是试着自己写了一个id生成器,有些id是int的,比如说任务id:有些 ...
- LVM快照(snapshot)备份
转载自:http://wenku.baidu.com/link?url=cbioiMKsfrxlzrJmoUMaztbrTelkE0FQ8F9qUHX7sa9va-BkkL4amvzCCAKg2hBv ...
- Gradle学习系列之二——创建Task的多种方法
在本系列的上篇文章中,我们讲到了Gradle入门,在本篇文章中我们将讲到创建Task的多种方法. 请通过以下方式下载本系列文章的Github示例代码: git clone https://github ...
- Scrum1.2--spring计划
项目功能--深入分析 燃尽图