你的分享就是我们的动力 ---﹥

Android代码规范

时间:2013-06-07 15:34来源:www.chengxuyuans.com 点击:

[-]

  1. 一Import的次序
  2. 二缩进Indentation
    1. 总则
    2. 示例代码
    3. 规则说明
  3. 三大括号Braces的位置
    1.  
    2. 示例代码
    3. 规则说明
  4. 四空格White Space
    1. 声明
      1. 临时变量
      2. 构造体
      3. 方法
      4. 标号
      5. 注解Annotation
      6. 枚举Enumtypes
      7. 注解类型Annotationtypes
    2. 控制语句
      1. 程序块
      2. if else语句
      3. for语句
      4. switch语句
      5. while和dowhile语句
      6. 同步synchronized语句
      7. catch语句
      8. assert语句
      9. return语句
      10. throw语句
    3. 表达式
      1. 函数调用
      2. 赋值
      3. 操作数
      4. 加括号的表达式
      5. 类型转换
      6. 三元条件表达式
    4. 数组
      1. 声明
      2. 申请
      3. 初始化体
      4. 数组元素的访问
    5. 泛型
  5. 五空白行BlankLines
    1. 示例代码
    2. 规则说明
      1. 编译单元之间的空白行
      2. 类内部的空白行
    3. 六插入新行NewLines
      1. 示例代码
      2. 规则说明
        1. 插入新行
        2. 数组初始化
        3. 空的语句
        4. 注解
      3. 七控制语句ControlStatements
        1. 示例代码
        2. 规则说明
      4. 八换行LineWrapping
        1. 总则
        2. 注解Annotation
        3. 类声明
        4. 构造体声明
        5. 方法声明
        6. 枚举声明
        7. 函数调用
        8. 表达式
        9. 语句
      5. 九注释Comments
      6. 十Android中XML文件的格式化
      7. 总结

 

Google对Android的编程规范在Code Style Guidelines for Contributors中做了描述,并在Android源码中release了import和Java的配置文件android.importorder与android-formatting.xml。本文分析这些配置文件在Eclipse环境下格式化Android编码规范都做了什么,在Java和XML文件中如何具体体现。

Android源码目录<android_src_root>/development/ide/eclipse/下有文件android.importorder和android-formatting.xml,可以在Eclipse中导入import次序及Java编码风格:

1)?????打开Window > Preferences > Java > Code Style;

2)?????在Organizer Imports中点击Imports,选择android.importorder导入;

3)?????在Formatter中点击Imports,选择android-formatting.xml导入。

下面讲解这些配置都做了什么,在代码中如何具体体现的。

一、Import的次序

Google推荐的AndroidJava文件开头import的次序(按照先后)是:

  1. com
  2. org
  3. android
  4. java
  5. javax

排列原则:

 

  • ?这个次序也是根据看import语句的重要性来排定的:首先希望看到用了android里的哪些类;然后是其他第三方的;最后才关注标准Java库里的。
  • ?不同的import分组之间是有一个空白行,在5.2.1?4)中描述。
  • ?同一import分组内部按照字母次序排列。

 

二、缩进(Indentation)

2.1 总则

缩进只用空格,不用制表符(TAB)。缩进用4个空格,按下TAB键用4个空格代替。

?

2.2 示例代码

?

[java]?view plaincopy
  1. /**?
  2. ?*?Indentation?
  3. ?*/??
  4. class?Example?{??
  5. ????int[]?myArray?=?{??
  6. ????????????1,?2,?3,?4,?5,?6??
  7. ????};??
  8. ???
  9. ????int?theInt?=?1;??
  10. ???
  11. ????String?someString?=?"Hello";??
  12. ???
  13. ????double?aDouble?=?3.0;??
  14. ???
  15. ????void?foo(int?a,?int?b,?int?c,?int?d,?int?e,?int?f)?{??
  16. ????????switch?(a)?{??
  17. ????????????case?0:??
  18. ????????????????Other.doFoo();??
  19. ????????????????break;??
  20. ????????????default:??
  21. ????????????????Other.doBaz();??
  22. ????????}??
  23. ????}??
  24. ???
  25. ????void?bar(List?v)?{??
  26. ????????for?(int?i?=?0;?i?<10;?i++)?{??
  27. ????????????v.add(new?Integer(i));??
  28. ????????}??
  29. ????}??
  30. }??
  31. ???
  32. enum?MyEnum?{??
  33. ????UNDEFINED(0)?{??
  34. ????????void?foo()?{??
  35. ????????}??
  36. ????}??
  37. }??
  38. ???
  39. @interface?MyAnnotation?{??
  40. ????int?count()?default?1;??
  41. }??
  42. ???

 

2.3 规则说明

 

1)????? 域不用对齐

? ? ? ??若对齐的话,则myArray,theInt, someString和aDouble都在同一列上对齐。

2)?????类体内部的声明全都缩进

? ? ? ??Class Example内的定义[#5 ~ #29]相对class?Example[#4]都有缩进

3)?????枚举的声明要缩进

? ? ? ??UNDEFINED(0) [#33]前面有缩进

4)?????枚举内的常量要缩进

? ? ? ??void?foo() [#34]前面有缩进

5)?注解的声明要缩进

? ? ? ??int?count()[#39]前面有缩进

6)?????方法/构造体内的语句要缩进

? ? ? ??方法foo和bar内的语句[#16 ~ #22, #26 ~ #28]都有缩进

7)?????程序块内的语句要缩进

? ? ? ??for循环内的v.add(new?Integer(i))[#27]有缩进

8)?????switch内的语句要缩进

? ? ? ? switch内的语句[#17 ~ #21]相对switch有缩进

9)?????case内的语句要缩进

? ? ? ??Other.doFoo()[#18]相对于case;Other.doBaz()[#21]相对于default都有缩进

10)??break语句要缩进

? ? ? ??break[#19]相对于case有缩进

11)??空白行不用缩进

? ? ? ??域和方法之间的空白行[#8, #10, #12, #14, #24]是没有缩进的

三、大括号(Braces)的位置

 

3.1 示例代码

[java]?view plaincopy
  1. /**?
  2. ?*?Braces?
  3. ?*/??
  4. interface?Empty?{??
  5. }??
  6. ???
  7. enum?MyEnum?{??
  8. ????UNDEFINED(0)?{??
  9. ????????void?foo()?{??
  10. ????????}??
  11. ????}??
  12. }??
  13. ???
  14. @interfaceSomeAnnotationType?{??
  15. }??
  16. ???
  17. class?Example?{??
  18. ????SomeClass?fField?=?new?SomeClass()?{??
  19. ????};??
  20. ???
  21. ????int[]?myArray?=?{??
  22. ????????????1,?2,?3,?4,?5,?6??
  23. ????};??
  24. ???
  25. ????int[]?emptyArray?=?new?int[]?{};??
  26. ???
  27. ????Example()?{??
  28. ????}??
  29. ???
  30. ????void?bar(int?p)?{??
  31. ????????for?(int?i?=?0;?i?<10;?i++)?{??
  32. ????????}??
  33. ????????switch?(p)?{??
  34. ????????????case?0:??
  35. ????????????????fField.set(0);??
  36. ????????????????break;??
  37. ????????????case?1:?{??
  38. ????????????????break;??
  39. ????????????}??
  40. ????????????default:??
  41. ????????????????fField.reset();??
  42. ????????}??
  43. ????}??
  44. }??
  45. ???

?

3.2? 规则说明

1)类或接口的声明跟左大括号在同一行上

#4 Empty以及 #17 Example后面{的位置

2)?????匿名类的声明跟左大括号在同一行上

? ? ? ??#18 SomeClass后面{的位置

3)?????构造体的声明跟左大括号在同一行上

? ? ? ??#27 Example()后面{的位置

4)?????方法的声明跟左大括号在同一行上

? ? ? ??#9 foo和#30 bar后面{的位置

5)?????枚举的声明跟左大括号在同一行上

? ? ? ??#7 MyEnum 后面{的位置

6)?????枚举常量体跟左大括号在同一行上

? ? ? ??#8 UNDEFINED(0) 后面{的位置

7)?????注解类型的声明跟左大括号在同一行上

? ? ? ??#14 SomeAnnotationType后面{的位置

8)?????程序块跟左大括号在同一行上

? ? ? ??#31 for后面{的位置

9)?????case语句中的程序块跟左大括号在同一行上

? ? ? ??#37 case 1后面{的位置

10)??switch语句跟左大括号在同一行上

? ? ? ??#33 switch后面{的位置

11)??数组的初始化常量跟左大括号在同一行上

? ? ? ? #21和#25 {的位置

?

?

四、空格(White Space)

?

4.1 声明

?

4.1.1 类

?

[java]?view plaincopy
  1. class?MyClass?implements?I0,?I1,?I2?{??
  2. }??
  3. ???
  4. AnonClass?=?new?AnonClass()?{??
  5. ????void?foo(Some?s)?{??
  6. ????}??
  7. };??

·????????类的左大括号的前面加空格;

·????????匿名类的左大括号的前面加空格;

·????????implements语句中逗号的前面,不加空格;

·????????implements语句中逗号的后面,加上空格;

?

4.1.2 域

?

[java]?view plaincopy
  1. int?a?=?0,?b?=?1,?c=?2,?d?=?3;??

?

·????????多个域声明中逗号的前面,不加空格;

·????????多个域声明中逗号的后面,加上空格。

?

4.1.3 临时变量

?

[java]?view plaincopy
  1. int?a?=?0,?b?=?1,?c=?2,?d?=?3;??

?

·????????多个临时变量声明中逗号的前面,不加空格;

·????????多个临时变量声明中逗号的后面,加上空格;

?

4.1.4 构造体

[java]?view plaincopy
  1. MyClass()?throws?E0,?E1?{??
  2. ????this(0,?0,?0);??
  3. }??
  4. ???
  5. MyClass(int?x,?int?y,?int?z)?throws?E0,?E1?{??
  6. ????super(x,?y,?z,?true);??
  7. }??

·????????左小括号的前面,不加空格;

·????????左小括号的后面,不加空格;

·????????右小括号的前面,不加空格;

·????????小括号内为空,则它们之间不加空格;

·????????左大括号前面,加上空格;

·????????参数列表中逗号之前,不加空格;

·????????参数列表中逗号之后,加上空格;

·????????throws语句中逗号之前,不加空格;

·????????throws语句中逗号之后,加上空格。

?

4.1.5 方法

?

[java]?view plaincopy
  1. void?foo()?throws?E0,?E1?{??
  2. };??
  3. ???
  4. void?bar(int?x,?int?y)?throws?E0,?E1?{??
  5. }??
  6. ???
  7. void?format(Strings,?Object...?args)?{??
  8. }??

·????????左小括号的前面,不加空格;

·????????左小括号的后面,不加空格;

·????????右小括号的前面,不加空格;

·????????小括号内为空,则它们之间不加空格;

·????????左大括号前面,加上空格;

·????????参数列表中逗号之前,不加空格;

·????????参数列表中逗号之后,加上空格;

·????????可变参数列表省略号之前,不加空格;

·????????可变参数列表省略号之后,加上空格;

·????????throws语句中逗号之前,不加空格;

·????????throws语句中逗号之后,加上空格。

?

4.1.6 标号

?

[java]?view plaincopy
  1. label:?for?(int?i?=?0;?i?<?list.length;?i++)?{??
  2. ????for?(int?j?=?0;?j?<?list[i].length;?j++)??
  3. ????????continue?label;??
  4. }??

·????????冒号之前,不加空格;

·????????冒号之后,加上空格

?

4.1.7 注解/Annotation

?

[java]?view plaincopy
  1. @Annot(x?=?23,?y?=?-3)??
  2. public?class?A?{??
  3. }??

·????????‘@’之后,不加空格;

·????????左小括号的前面,不加空格;

·????????左小括号的后面,不加空格;

·????????逗号前面,不加空格;

·????????逗号后面,加上空格;

·????????右小括号的前面,不加空格

?

4.1.8 枚举/Enumtypes

?

[java]?view plaincopy
  1. enum?MyEnum?{??
  2. ????GREEN(0,?1),?RED()?{??
  3. ????????void?process()?{??
  4. ????????}??
  5. ????}??
  6. }??

·????????声明中左大括号的前面[#1],加上空格;

·????????常量之间的逗号[#2 RED前]前面,不加空格;

·????????常量之间的逗号[#2 RED前]后面,加上空格;

·????????常量参数的左小括号[#2 GREEN后]前面,不加空格;

·????????常量参数的左小括号[#2 GREEN后]后面,不加空格;

·????????常量参数的小括号[#2 RED后]中间为空,括号之间不加空格;

·????????常量参数之间的逗号[#2 GREEN()里面]前面,不加空格;

·????????常量参数之间的逗号[#2 GREEN()里面]后面,加上空格;

·????????常量参数的右小括号[#2 GREEN()后]前面,不加空格;

·????????常量体左大括号[#2 RED后]前面,加上空格。

?

4.1.9 注解类型/Annotationtypes

?

[java]?view plaincopy
  1. @interface?MyAnnotation?{??
  2. ????String?value();??
  3. }??
  4. ???
  5. @interface?OtherAnnotation?{??
  6. }??

·????????‘@’之前,不加空格;

·????????‘@’之后,不加空格

·????????左大括号的前面,加上空格;

·????????注解类型成员的左小括号的前面,不加空格;

·????????注解类型成员的小括号的之间,不加空格;

?

4.2 控制语句

?

4.2.1 程序块

?

[java]?view plaincopy
  1. if?(true)?{??
  2. ????return?1;??
  3. }?else?{??
  4. ????return?2;??
  5. }??

·????????左大括号前面,加上空格;

·????????右大括号后面,加上空格。

?

4.2.2 if else语句

?

[java]?view plaincopy
  1. if?(condition)?{??
  2. ????return?foo;??
  3. }?else?{??
  4. ????return?bar;??
  5. }??

·????????左小括号前加上空格;

·????????左小括号后不加空格;

·????????右小括号前不加空格【左大括号前的空格是规则#4.2.1】

?

4.2.3 for语句

?

[java]?view plaincopy
  1. for?(int?i?=?0,?j?=?array.length;?i?<?array.length;?i++,?j--)?{??
  2. }??
  3. for?(String?s?:?names)?{??
  4. }??

·????????左小括号前加上空格;

·????????左小括号后不加空格;

·????????右小括号前不加空格【左大括号前的空格是规则#4.2.1】

·????????初始化语句的逗号前不加空格;

·????????初始化语句的逗号后加上空格

·????????增量语句的逗号前不加空格;

·????????增量语句的逗号后加上空格

·????????语句之间的分号前不加空格;

·????????语句之间的分号后加上空格;

·????????冒号前面加上空格;

·????????冒号后面加上空格。

?

4.2.4 switch语句

?

[java]?view plaincopy
  1. switch?(number)?{??
  2. ????case?RED:??
  3. ????????return?GREEN;??
  4. ????case?GREEN:??
  5. ????????return?BLUE;??
  6. ????case?BLUE:??
  7. ????????return?RED;??
  8. ????default:??
  9. ????????return?BLACK;??
  10. }??

· ? ? ? ?case和default的冒号(‘:’)前不加空格;

·????????左括号(‘(’)和左大括号(‘{’)前都加上空格;

·????????左括号(‘(’)后和右括号(‘)’)前都不加空格。

?

4.2.5 while和dowhile语句

?

[java]?view plaincopy
  1. while?(condition)?{??
  2. }??
  3. ;??
  4. do?{??
  5. }?while?(condition);??

·????????左括号前加上空格;

·????????左括号后不加空格;

·????????右括号前不加空格【#1左大括号前的空格是规则#4.2.1】

?

4.2.6 同步(synchronized)语句

?

[java]?view plaincopy
  1. synchronized?(list)?{??
  2. ????list.add(element);??
  3. }??

·????????左括号前加上空格;

·????????左括号后不加空格;

·????????右括号前不加空格【左大括号前的空格是规则#4.2.1】

?

4.2.7 catch语句

?

[java]?view plaincopy
  1. try?{??
  2. ????number?=?Integer.parseInt(value);??
  3. }?catch?(NumberFormatException?e)?{??
  4. }??

·????????左括号前加上空格;

·????????左括号后不加空格;

·????????右括号前不加空格【左大括号前的空格是规则#4.2.1】

?

4.2.8 assert语句

?

[java]?view plaincopy
  1. assert?condition?:?reportError();??

?

冒号前后都加上空格

?

4.2.9 return语句

?

[java]?view plaincopy
  1. return?(o);??

?

括号表达式前加上空格

?

4.2.10 throw语句

?

[java]?view plaincopy
  1. throw?(e);??

?

括号表达式前加上空格

?

4.3 表达式

?

4.2.1 函数调用

?

[java]?view plaincopy
  1. foo();??
  2. bar(x,?y);??
  3. ???
  4. String?str?=?new?String();??
  5. Point?point?=?new?Point(x,?y);??
  6. ???
  7. MyClass()?throws?E0,?E1?{??
  8. ????this(0,?0,?0);??
  9. }??
  10. ???
  11. MyClass(int?x,?int?y,?int?z)?throws?E0,?E1?{??
  12. ????super(x,?y,?z,?true);??
  13. }??

·????????左括号的前后都不加空格;

·????????右括号前不加空格;

·????????空的参数的左右括号之间不加空格;

·????????方法调用时多个参数之间分割的逗号前面不加空格,逗号后面加空格

·????????对象申请时多个参数之间分割的逗号前面不加空格,逗号后面加空格

·????????显示调用构造函数时多个参数之间分割的逗号前面不加空格,逗号后面加空格

?

4.3.2 赋值

?

[java]?view plaincopy
  1. List?list?=?new?ArrayList();??
  2. int?a?=?-4?+?-9;??
  3. b?=?a++?/?--number;??
  4. c?+=?4;??
  5. boolean?value?=?true?&&?false;??

赋值操作(=)前后都加上空格。【注意:‘+=’是一个操作数】

?

4.3.3 操作数

?

[java]?view plaincopy
  1. List?list?=?new?ArrayList();??
  2. int?a?=?-4?+?-9;??
  3. b?=?a++?/?--number;??
  4. c?+=?4;??
  5. boolean?value?=?true?&&?false;??

·????????二元操作(#2的‘+’;#3的‘/’;#5的‘&&’)前后都加上空格;

·????????一元操作(#2 ‘4’和‘9’前面的‘-’)前后都不加空格【示例中‘-’前的空格不是这个规则里的】;

·????????前置操作的(#3的‘--number’)前后都不加空格【示例中‘--’前的空格不是这个规则里的】;

·????????后置操作的(#3的‘a++’)前后都不加空格【示例中‘++’后的空格不是这个规则里的】。

?

4.3.4 加括号的表达式

?

[java]?view plaincopy
  1. result?=?(a?*?(b?+?c?+?d)?*?(e?+?f));??

?

左括号前,左括号后和右括号前都不加空格【示例中左括号前的空格不是这个规则里的】

?

4.3.5 类型转换

?

[java]?view plaincopy
  1. String?s?=?((String)?object);??

?

·????????右括号后加上空格;

·????????左括号后和右括号前都不加空格。

?

4.3.6 三元条件表达式

?

[java]?view plaincopy
  1. String?value?=?condition???TRUE?:?FALSE;??

?

问号前,问号后,冒号前,冒号后都要加上空格

?

4.4 数组

?

?

[java]?view plaincopy
  1. int[]?array0?=?new?int[]?{};??
  2. int[]?array1?=?new?int[]?{??
  3. ????????1,?2,?3??
  4. };??
  5. int[]?array2?=?new?int[3];??
  6. ???
  7. array[i].foo();??

?

4.4.1 声明

·????????左中括号前不加空格;

·????????左右中括号中间不加空格

示例中:arrayX前的‘[]’

?

4.4.2 申请

·????????左中括号前后都不加空格;

·????????右中括号前不加空格;

·????????空的左右中括号中间不加空格;

示例中:等号‘=’后面的‘[]’

?

4.4.3 初始化体

·????????左大括号前后都加上空格;

·????????右大括号前加上空格;

·????????逗号前不加空格;

·????????逗号后加上空格;

·????????空的大括号中间不加空格

?

4.4.4 数组元素的访问

·????????左中括号前后都不加空格;

·????????右中括号前面不加空格

?

4.5 泛型

?

[java]?view plaincopy
  1. Map<String,?Element>?map?=?newHashMap<String,?Element>();??
  2. ???
  3. x.<String,?Element>?foo();??
  4. ???
  5. classMyGenericType<S,?T?extends?Element?&?List>?{??
  6. }??
  7. ???
  8. Map<X<?>,?Y<??extendsK,???super?V>>?t;??

?

?

五、空白行(BlankLines)

?

5.1 示例代码

?

[java]?view plaincopy
  1. /**?
  2. ?*?Blank?Lines?
  3. ?*/??
  4. ???
  5. package?foo.bar.baz;??
  6. ???
  7. import?java.util.List;??
  8. import?java.util.Vector;??
  9. ???
  10. import?java.net.Socket;??
  11. ???
  12. public?class?Another?{??
  13. }??
  14. ???
  15. public?class?Example?{??
  16. ????public?static?class?Pair?{??
  17. ????????public?String?first;??
  18. ???
  19. ????????public?String?second;??
  20. ????????//?Between?here...??
  21. ???
  22. ????????//?...and?here?are?10?blank?lines??
  23. ????};??
  24. ???
  25. ????private?LinkedList?fList;??
  26. ???
  27. ????public?int?counter;??
  28. ???
  29. ????publicExample(LinkedList?list)?{??
  30. ????????fList?=?list;??
  31. ????????counter?=?0;??
  32. ????}??
  33. ???
  34. ????public?void?push(Pair?p)?{??
  35. ????????fList.add(p);??
  36. ????????++counter;??
  37. ????}??
  38. ???
  39. ????public?Object?pop()?{??
  40. ????????--counter;??
  41. ????????return?(Pair)fList.getLast();??
  42. ????}??
  43. }??
  44. ???

?

5.2 规则说明

?

5.2.1 编译单元之间的空白行

1)?????包声明之前有一空白行[#4]

2)?????包声明之后有一空白行[#6]

3)?????import声明之前有一空白行[#6]

4)?????import各个分组之间有一空白行[#9]

5)?????import声明之后有一空白行[#11]

6)?????类声明之间有一空白行[#14]

?

5.2.2 类内部的空白行

1)?????第一个声明之间无空白行[#15 & #16之间]

2)?????相同分类声明之前有一空白行[#24, #28]

3)?????成员类声明之前有一空白行

4)?????域声明之前有一空白行[#18, #24, #26]

5)????? 方法声明之前有一空白行[#28,#33, #38]??????????

6)????? 方法内的开始处没有空白行[#29和#30之间;#34与#35之间;#39与#40之间]

?

?

六、插入新行(NewLines)

?

6.1 示例代码

?

[java]?view plaincopy
  1. /**?
  2. ?*?New?Lines?
  3. ?*/??
  4. public?class?Empty?{??
  5. }??
  6. ???
  7. class?Example?{??
  8. ????static?int[]?fArray?=?{??
  9. ????????????1,?2,?3,?4,?5??
  10. ????};??
  11. ???
  12. ????Listener?fListener?=?new?Listener()?{??
  13. ????};??
  14. ???
  15. ????@Deprecated??
  16. ????@Override??
  17. ????public?void?bar(@SuppressWarnings("unused")?int?i)?{??
  18. ????????@SuppressWarnings("unused")??
  19. ????????int?k;??
  20. ????}??
  21. ???
  22. ????void?foo()?{??
  23. ????????;??
  24. ????????;??
  25. ????????label:?do?{??
  26. ????????}?while?(false);??
  27. ????????for?(;;)?{??
  28. ????????}??
  29. ????}??
  30. }??
  31. ???
  32. enum?MyEnum?{??
  33. ????UNDEFINED(0)?{??
  34. ????}??
  35. }??
  36. ???
  37. enum?EmptyEnum?{??
  38. }??
  39. ???
  40. @interface?EmptyAnnotation{??
  41. }??
  42. ???

?

6.2 规则说明

?

6.2.1 插入新行

1)?????类体内为空,插入新行[#5是另起的一行]

2)?????匿名类体内为空,插入新行[#13是另起的一行]

3)?????方法内为空,插入新行

4)?????空的程序块,插入新行[#26是另起的一行;#28是另起的一行]

5)?????标号后面不插入新行[#25 do与label在同一行]

6)?????在空的枚举声明中,插入新行[#38是另起的一行]

7)?????在空的枚举常量体中,插入新行[#34是另起的一行]

8)?????在空的注解体中,插入新行[#41是另起的一行]

9)?????在文件结尾,插入新行[#42是另起的一行]

?

6.2.2 数组初始化

1)?????数组初始化体的左大括号后,插入新行[#9是另起的一行]

2)?????数组初始化体的右大括号前,插入新行[#10是另起的一行]

?

6.2.3 空的语句

空的语句放在新行上[#24是另起的一行]

?

6.2.4 注解

1)?????对成员的注解之后,插入新行[#16 & #17都是另起的一行]

2)?????对参数的注解之后,不插入新行[#17 int i与@SuppressWarnings("unused")在同一行]

3)?????对临时变量的注解之后,插入新行[#19是另起的一行]

?

?

七、控制语句(ControlStatements)

?

7.1 示例代码

?

[java]?view plaincopy
  1. /**?
  2. ?*?If...else?
  3. ?*/??
  4. class?Example?{??
  5. ????void?bar()?{??
  6. ????????do?{??
  7. ????????}?while?(true);??
  8. ????????try?{??
  9. ????????}?catch?(Exception?e)?{??
  10. ????????}?finally?{??
  11. ????????}??
  12. ????}??
  13. ???
  14. ????void?foo2()?{??
  15. ????????if?(true)?{??
  16. ????????????return;??
  17. ????????}??
  18. ????????if?(true)?{??
  19. ????????????return;??
  20. ????????}?else?if?(false)?{??
  21. ????????????return;??
  22. ????????}?else?{??
  23. ????????????return;??
  24. ????????}??
  25. ????}??
  26. ???
  27. ????void?foo(int?state)?{??
  28. ????????if?(true)??
  29. ????????????return;??
  30. ????????if?(true)??
  31. ????????????return;??
  32. ????????else?if?(false)??
  33. ????????????return;??
  34. ????????else??
  35. ????????????return;??
  36. ????}??
  37. }??
  38. ???

?

7.2 规则说明

?

1)?????if语句的else之前,不插入新行[#20& #22的else与‘}’在同一行]

2)?????try语句的catch之前,不插入新行[#9的catch与‘}’在同一行]

3)?????try语句的finally之前,不插入新行[#10的finally与‘}’在同一行]

4)?????do语句的while之前,不插入新行[#7的while与‘}’在同一行]

5)?????#29的‘then’语句与#28的if在不同行,#31的‘then’语句与#30的if在不同行;

6)?????#35的else语句与#34的else在不同行;

7)?????#20和#32的else if中‘else与‘if’在同一行;

8)?????‘return’或‘throw’语句不需要在一行上[#16与#15在两行上]

?

?

八、换行(LineWrapping)

?

8.1 总则

  • ?每行最多100个字符;
  • ?超过100个字符的行要换行,新行缺省缩进2个缩进单位。一个缩进单位是4个空格,所以这里总共缩进8个空格
  • ?缺省数组初始化值缺省缩进2个缩进单位。

?

8.2 注解(Annotation)

[java]?view plaincopy
  1. /**?
  2. ?*?Element-value?pairs?
  3. ?*/??
  4. @MyAnnotation(value1?=?"this?isan?example",?value2?=?"of?an?annotation",?value3?=?"withseveral?arguments",?value4?=?"by?Haili?TIAN?(haili.tian@gmail.com)")??
  5. class?Example?{??
  6. }??

注解不换行:value1、value2、value3和value4都在同一行上。

?

8.3 类声明

?

[java]?view plaincopy
  1. /**?
  2. ?*?'extends'?clause?
  3. ?*/??
  4. class?Example?extends??
  5. ????????OtherClass?{??
  6. }??
  7. ???
  8. /**?
  9. ?*?'implements'?clause?
  10. ?*/??
  11. class?Example?implements?I1,??
  12. ????????I2,?I3?{??
  13. }??
  14. ???
  • ?extends子句在需要换行的地方,用缺省换行方式换行:#5OtherClass处换行,且OtherClass相对class缩进了8个空格;
  • ?implements子句在需要换行的地方,用缺省换行方式换行:#12I2处换行,且I2相对class缩进了8个空格。

?

?

8.4 构造体声明

?

[java]?view plaincopy
  1. /**?
  2. ?*?Parameters?
  3. ?*/??
  4. class?Example?{??
  5. ????Example(int?arg1,?int?arg2,??
  6. ????????????int?arg3,?int?arg4,??
  7. ????????????int?arg5,?int?arg6)?{??
  8. ????????this();??
  9. ????}??
  10. ???
  11. ????Example()?{??
  12. ????}??
  13. }??
  14. ???
  15. /**?
  16. ?*?'throws'?clause?
  17. ?*/??
  18. class?Example?{??
  19. ????Example()?throws?FirstException,??
  20. ????????????SecondException,??
  21. ????????????ThirdException?{??
  22. ????????returnOther.doSomething();??
  23. ????}??
  24. }??
  25. ???
  • ?构造体的参数在需要换行的地方,用缺省换行方式换行:参数[#6 &#7]相对Example[#5]缩进了8个空格;
  • ?构造体throws子句在需要换行的地方,用缺省换行方式换行:子句[#20& #21]相对Example[#19]缩进了8个空格。

?

?

8.5 方法声明

?

[java]?view plaincopy
  1. /**?
  2. ?*?Declaration?
  3. ?*/??
  4. class?Example?{??
  5. ????public?final?synchronizedjava.lang.String?a_method_with_a_long_name()?{??
  6. ????}??
  7. }??
  8. ???
  9. /**?
  10. ?*?Parameters?
  11. ?*/??
  12. class?Example?{??
  13. ????void?foo(int?arg1,?int?arg2,??
  14. ????????????int?arg3,?int?arg4,??
  15. ????????????int?arg5,?int?arg6)?{??
  16. ????}??
  17. }??
  18. ???
  19. /**?
  20. ?*?'throws'?clause?
  21. ?*/??
  22. class?Example?{??
  23. ????int?foo()?throws?FirstException,??
  24. ????????????SecondException,??
  25. ????????????ThirdException?{??
  26. ????????returnOther.doSomething();??
  27. ????}??
  28. }??
  29. ???
  • ?方法声明处不换行:#5 很长,但不分行;
  • ?方法声明处的参数在需要换行的地方,用缺省换行方式换行:参数[#14& #15]相对voidfoo [#13]缩进了8个空格;
  • ?方法声明处的throws子句在需要换行的地方,用缺省换行方式换行:子句[#24& #25]相对intfoo [#23]缩进了8个空格。

?

?

8.6 枚举声明

?

[java]?view plaincopy
  1. /**?
  2. ?*?Constants?
  3. ?*/??
  4. enum?Example?{??
  5. ????CANCELLED,?RUNNING,?WAITING,?FINISHED??
  6. }??
  7. ???
  8. enum?Example?{??
  9. ????GREEN(0,?255,?0),?RED(??
  10. ????????????255,?0,?0)??
  11. }??
  12. ???
  13. /**?
  14. ?*?'implements'?clause?
  15. ?*/??
  16. enum?Example?implements?A,?B,??
  17. ????????C?{??
  18. }??
  19. ???
  20. /**?
  21. ?*?Constant?arguments?
  22. ?*/??
  23. enum?Example?{??
  24. ????GREEN(0,?255,?0),?RED(??
  25. ????????????255,?0,?0)??
  26. }??
  27. ???
  • ?枚举常量定义的地方,不换行:#5不换行;
  • ?implements子句在需要换行的地方,用缺省换行方式换行:#17 C处换行,且C相对enum缩进了8个空格;
  • ?常量参数在需要换行的地方,用缺省换行方式换行:#10 和#25处换行,且相对GREEN缩进了8个空格。

?

?

8.7 函数调用

?

[java]?view plaincopy
  1. /**?
  2. ?*?Arguments?
  3. ?*/??
  4. class?Example?{??
  5. ????void?foo()?{??
  6. ????????Other.bar(??
  7. ????????????????100,??
  8. ????????????????nested(200,?300,?400,??
  9. ????????????????????????500,?600,?700,??
  10. ????????????????????????800,?900));??
  11. ????}??
  12. }??
  13. ???
  14. /**?
  15. ?*?Qualified?invocations?
  16. ?*/??
  17. class?Example?{??
  18. ????int?foo(Some?a)?{??
  19. ????????return?a.getFirst();??
  20. ????}??
  21. }??
  22. ???
  23. /**?
  24. ?*?Explicit?constructor?invocations?
  25. ?*/??
  26. class?Example?extends?AnotherClass?{??
  27. ????Example()?{??
  28. ????????super(100,?200,?300,400,?500,??
  29. ????????????????600,?700);??
  30. ????}??
  31. }??
  32. ???
  33. /**?
  34. ?*?Object?allocation?arguments?
  35. ?*/??
  36. class?Example?{??
  37. ????SomeClass?foo()?{??
  38. ????????return?new?SomeClass(100,200,??
  39. ????????????????300,?400,?500,?600,??
  40. ????????????????700,?800,?900);??
  41. ????}??
  42. }??
  43. ???
  44. /**?
  45. ?*?Qualified?object?allocation?arguments?
  46. ?*/??
  47. class?Example?{??
  48. ????SomeClass?foo()?{??
  49. ????????return?SomeOtherClass.new?SomeClass(??
  50. ????????????????100,?200,?300,?400,?500);??
  51. ????}??
  52. }??
  53. ???
  • ?函数调用参数处,在需要换行的地方,用缺省换行方式换行:#7, #8和#9, #10处换行,且#7,#8相对Other.bar缩进了8个空格, #9, #10相对nested缩进了8个空格;
  • ?对象的方法调用处,在需要换行的地方,用缺省换行方式换行:#19这个例子不太好,如果这句很长,可以在a和getFirst之间换行,且.放在getFirst前;
  • ?显示的构造函数调用处,在需要换行的地方,用缺省换行方式换行:#29处换行,且相对#30的super缩进8个空格;
  • ?对象创建参数处,在需要换行的地方,用缺省换行方式换行:#39, #40处换行,且相对#38的return缩进8个空格;
  • ?对象方法构造对象参数处,在需要换行的地方,用缺省换行方式换行:#50处换行,且相对#49的return缩进8个空格.

?

?

8.8 表达式

?

[java]?view plaincopy
  1. /**?
  2. ?*?Binary?expressions?
  3. ?*/??
  4. class?Example?extends?AnotherClass?{??
  5. ????int?foo()?{??
  6. ????????int?sum?=?100?+?200?+?300?+?400??
  7. ????????????????+?500?+?600?+?700?+?800;??
  8. ????????int?product?=?1?*?2?*?3?*?4?*?5??
  9. ????????????????*?6?*?7?*?8?*?9?*?10;??
  10. ????????boolean?val?=?true?&&?false??
  11. ????????????????&&?true?&&?false??
  12. ????????????????&&?true;??
  13. ????????return?product?/?sum;??
  14. ????}??
  15. }??
  16. ???
  17. /**?
  18. ?*?Conditionals?
  19. ?*/??
  20. class?Example?extends?AnotherClass?{??
  21. ????int?Example(boolean?Argument)?{??
  22. ????????return?argument??100000??
  23. ????????????????:?200000;??
  24. ????}??
  25. }??
  26. ???
  27. /**?
  28. ?*?Array?initializers?
  29. ?*/??
  30. class?Example?{??
  31. ????int[]?fArray?=?{??
  32. ????????????1,?2,?3,?4,?5,?6,?7,?8,?9,??
  33. ????????????10,?11,?12??
  34. ????};??
  35. }??
  36. ???
  37. /**?
  38. ?*?Assignments?
  39. ?*/??
  40. class?Example?{??
  41. ????private?static?final?String?string?="TextTextText";??
  42. ???
  43. ????void?foo()?{??
  44. ????????for?(int?i?=?0;?i?<10;?i++)?{??
  45. ????????}??
  46. ????????String?s;??
  47. ????????s?=?"TextTextText";??
  48. ????}??
  49. }??
  50. ???
  • ?二元表达式,在需要换行的地方,用缺省换行方式换行:#7, #9和#11,#12处换行,且#7相对int?sum缩进了8个空格,且#9相对int?product缩进了8个空格,且#11& #12相对boolean?val缩进了8个空格;
  • ?三元条件表达式,除了第一个元素,用缺省换行方式换行所有其他元素:#22& #23;
  • ?数组初始化体,在需要换行的地方,用缺省换行方式换行:#32 &#33处换行,且#32& #33相对int[] fArray缩进了8个空格;
  • ?赋值语句,不需要换行:#41行很长也不需要换行。

?

?

8.9 语句

?

[java]?view plaincopy
  1. /**?
  2. ?*?Compact?'if?else'?
  3. ?*/??
  4. class?Example?{??
  5. ????int?foo(int?argument)?{??
  6. ????????if?(argument?==?0)??
  7. ????????????return?0;??
  8. ????????if?(argument?==?1)??
  9. ????????????return?42;??
  10. ????????else??
  11. ????????????return?43;??
  12. ????}??
  13. }??
  14. ???
配置起什么用,没看懂!

?

?

九、注释(Comments)

?

?

[java]?view plaincopy
  1. ??
[java]?view plaincopy
  1. /**?
  2. ?*?An?example?for?comment?formatting.?This?example?is?meant?to?illustrate?the?various?possibilities?offered?by?<i>Haili?TIAN</i>?in?order?to?format?comments.?
  3. ?*/??
  4. ???
  5. package?mypackage;??
  6. ???
  7. /**?
  8. ?*?This?is?the?comment?for?the?example?interface.?
  9. ?*/??
  10. interface?Example?{??
  11. ????//?This?is?a?long?comment?with?white?space?that?should?be?split?in?multiple??
  12. ????//?line?comments?in?case?the?linecomment?formatting?is?enabled??
  13. ????int?foo3();??
  14. ?????
  15. //????void?commented()?{??
  16. //????????System.out.println("indented");??
  17. //????}??
  18. ???
  19. ????//?void?indentedCommented()?{??
  20. ????//?System.out.println("indented");??
  21. ????//?}??
  22. ???
  23. ????/*?block?comment?on?first?column?*/??
  24. ????int?bar();??
  25. ???
  26. ????/*?
  27. ?????*?These?possibilities?include:<ul><li>Formatting?of?header?
  28. ?????*?comments.</li><li>Formatting?of?Javadoc?tags</li></ul>?
  29. ?????*/??
  30. ????int?bar2();?//?This?is?along?comment?that?should?be?split?in?multiple?line??
  31. ????????????????//?comments?in?case?the?linecomment?formatting?is?enabled??
  32. ???
  33. ????/**?
  34. ?????*?The?following?is?some?sample?code?whichillustrates?source?formatting?
  35. ?????*?within?javadoc?comments:?
  36. ?????*?
  37. ?????*?<pre>?
  38. ?????*?public?class?Example?{?
  39. ?????*????final?int?a?=?1;?
  40. ?????*?
  41. ?????*????final?boolean?b?=?true;?
  42. ?????*?}?
  43. ?????*?</pre>?
  44. ?????*?
  45. ?????*?Descriptions?of?parameters?and?returnvalues?are?best?appended?at?end?of?
  46. ?????*?the?javadoc?comment.?
  47. ?????*?
  48. ?????*?@param?a?The?first?parameter.?For?an?optimum?result,?this?should?be?an?
  49. ?????*????????????odd?number?between?0?and?100.?
  50. ?????*?@param?b?The?second?parameter.?
  51. ?????*?@return?The?result?of?the?foo?operation,?usually?within?0?and?1000.?
  52. ?????*/??
  53. ????int?foo(int?a,?int?b);??
  54. }??
  • ?注释每行长度是80个字符;
  • ?开启对Javadoc注释的格式化;
    • ? 用html的TAG;
    • ? 开启对‘pre’TAG里的Java代码片段进行格式化;

?

#37 ~ #43

?

  • ? Javadoc TAG前面插入空白行;

?

#47是插入的行

?

  • ? Javadoc Tag缩进
    • §?‘@param’TAG后面的描述缩进

?

#49的odd相对#48的a缩进了4个空格。

?

  • ? 不对‘@param’TAG插入新行;

?

#48和#50的描述与参数在同一行。

?

  • ? ‘/**’和‘*/’在不同的行;
  • ? 移除空白行;

?

Javadoc注释形式见#33~ #52

?

  • ?开启对块注释的格式化;
    • ? ‘/*’和‘*/’在不同的行;
    • ? 移除空白行;

?

块注释形式见#26~ #29

?

  • ?开启对行注释的格式化;
    • ? 注释在行的第一列

?

#15, #16 和#17是行注释,且‘//’与原程序之间的空格仍旧保持。

?

  • ?关闭对头注释的格式化;

?

#1, #2和#3的头注释保持不变。

?

  • ?关闭对块注释缩进到第一列;

?

#23是块注释,与程序有相同的缩进,不是缩进到第一列。

?

  • ?关闭对行注释缩进到第一列;

?

注:笔者对行注释验证,发现Eclipse中无论如何设置,基本不会改变其行为。

?

?

十、Android中XML文件的格式化

?

前面讲了那么多都是针对Java程序的,Android中有大量的XML文件。对XML的格式也要进行排版格式化。

打开Window> Preferences,可以通过两个地方对XML文件进行格式化:

1)?????XML > XML Files > Editor

对其中的各项设置进行配置

2)?????Android > Editors

对其中的各项设置进行配置

?

?

总结

 本文分析了Android编码风格在Eclipse环境中具体实施,通过对Eclipse环境的配置可以方便的格式化Android程序:Java文件和XML文件,特别是Java文件,其配置是基于JDT实现的,所以对Java的方方面面的配置都覆盖了。

? ? ? ? 但是,只有这些还不够,对一般的Java设计编码原则和Android中推荐的风格还不能完全自动执行,还需要人的参与,依赖于团队风格规范的制定,成员的设计能力和领悟执行能力。下面是这些工具所不能解决的风格和原则:

?

  • ?对Exception的处理;
  • ?写短小的方法;
  • ?域的命名规则;
  • ?程序块内的逻辑分组;
  • ?等等。

转载注明地址:http://www.chengxuyuans.com/Android/64126.html