`
zhangyf1987hb
  • 浏览: 83921 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

代码规范

阅读更多

[-]

  1. 一Import的次序
  2. 二缩进Indentation
    1. 总则
    2. 示例代码
    3. 规则说明
  3. 三大括号Braces的位置
    1. 示例代码
    2. 规则说明
  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. 总结
 

田海立

2012-10-05

 

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.             123456  
  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.             123456  
  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(000);  
  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(01), 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(000);  
  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.         123  
  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.             12345  
  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(02550), RED(  
  10.             25500)  
  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(02550), RED(  
  25.             25500)  
  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(200300400,  
  9.                         500600700,  
  10.                         800900));  
  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(100200300,400500,  
  29.                 600700);  
  30.     }  
  31. }  
  32.    
  33. /** 
  34.  * Object allocation arguments 
  35.  */  
  36. class Example {  
  37.     SomeClass foo() {  
  38.         return new SomeClass(100,200,  
  39.                 300400500600,  
  40.                 700800900);  
  41.     }  
  42. }  
  43.    
  44. /** 
  45.  * Qualified object allocation arguments 
  46.  */  
  47. class Example {  
  48.     SomeClass foo() {  
  49.         return SomeOtherClass.new SomeClass(  
  50.                 100200300400500);  
  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.             123456789,  
  33.             101112  
  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的处理;
  •  写短小的方法;
  •  域的命名规则;
  •  程序块内的逻辑分组;
  •  等等。

 

 

分享到:
评论

相关推荐

    检查代码规范插件 检查代码规范插件

    在软件开发过程中,代码规范的重要性不言而喻。它不仅有助于提高代码的可读性和可维护性,还能确保团队成员之间的代码风格一致,减少沟通成本。Java作为一种广泛使用的编程语言,同样强调代码规范。本篇文章将详细...

    Matlab之代码规范.rar_MATLAB代码规范_matlab 代码规范_matlab编程规范_matlab规范_matla

    在MATLAB编程中,代码规范是提升代码可读性、可维护性和团队协作效率的关键因素。这份名为"Matlab之代码规范"的压缩包资源,包含了一份详细的MATLAB代码规范指南,以及相关的编程实例,旨在帮助程序员遵循最佳实践,...

    华为代码规范代码模板

    在软件开发过程中,代码规范和模板的使用是至关重要的,它们能够提高代码的可读性、可维护性和团队协作效率。华为作为全球领先的ICT解决方案提供商,对于代码质量有着极高的要求,因此制定了一套详尽的代码规范。这...

    阿里巴巴代码规范-泰山版.pdf

    阿里巴巴代码规范,又被称为阿里巴巴Java开发手册泰山版,是一份由阿里巴巴技术团队编写的、旨在规范Java开发者编程行为和提高代码质量的文档。该手册不仅关注编码细节,还涉及软件开发的多个方面,如异常处理、日志...

    iOS软件代码规范

    iOS 软件代码规范 iOS 软件代码规范是一份详细的编程规范,旨在指导 iOS 软件开发过程,提高代码质量和可维护性。这份规范涵盖了编程指引原则、布局、注释、命名规则、变量、常量、宏与类型、表达式与语句、函数、...

    Java代码规范.pdf

    Java代码规范文档中涉及的知识点涵盖了Java编程实践中的命名风格和代码组织方式,旨在为Java开发人员提供一份行业内部开发的准则,确保代码的可读性、一致性和维护性。以下是从提供的文档内容中提炼出的相关知识点:...

    百度前端代码规范.pdf

    百度前端代码规范是一份旨在统一前端开发标准的文档,由百度前端团队或社区成员共同维护和分享。该规范涵盖的内容非常全面,包括但不限于Javascript编码规范、HTML编码规范、CSS编码规范、Less编码规范、E-JSON数据...

    java、前端代码规范(阿里巴巴).zip

    Java和前端代码规范是软件开发中的重要组成部分,尤其是在大型企业如阿里巴巴这样的公司中,它们对于保持代码质量和团队协作至关重要。本压缩包包含了阿里巴巴制定的Java和前端开发的详细规范,帮助开发者遵循一致的...

    单片机程序编写代码规范工具

    单片机程序编写是电子工程和嵌入式系统开发中的重要环节,良好的代码规范对于项目的可维护性、可读性和团队协作至关重要。本工具旨在帮助开发者遵循一定的编码标准,提高代码质量,降低后期维护难度。以下是一些关于...

    代码规范代码规范.txt

    ### 代码规范详解 #### 一、引言 在软件开发过程中,良好的代码规范对于确保项目的可维护性、可读性和一致性至关重要。本篇将基于《代码规范代码规范.txt》的内容,详细介绍其中提及的各项规范要点及其重要性。 #...

    浅析框架与代码规范.pdf

    ### 浅析框架与代码规范 #### 代码规范的重要性及实践方法 在现代软件开发过程中,代码规范扮演着至关重要的角色。它不仅有助于提高代码的可读性和可维护性,还能促进团队之间的协作效率,减少潜在的错误和缺陷。...

    华为代码规范-C C++开发.zip

    《华为代码规范-C C++开发》是一份详细指导C++和C语言开发人员遵循的编程准则,旨在提高代码质量、可读性和维护性。这份规范不仅适用于华为内部的开发项目,也对广大的C++和C开发者具有重要的参考价值。其中涵盖了从...

    代码规范.pdf

    首先,标题为《代码规范.pdf》,这表明该文档是一份关于编程代码规范的文件,它很可能详述了在编写代码时应遵循的规则和标准。代码规范是为了统一开发人员的编码风格,提高代码的可读性、可维护性,从而确保项目的...

    阿里巴巴Java代码规范PDF.zip

    《阿里巴巴Java代码规范》是Java开发者们遵循的一套专业编程指南,旨在提高代码质量、可读性和维护性。这份规范由阿里巴巴集团内部的专家团队制定,经过多年的实践和完善,已经成为业界广泛参考的标准之一。以下是对...

    前端代码规范.pdf

    前端代码规范

    技术开发规范_代码规范文档_C++代码规范_

    本篇文章将详细阐述C++代码规范,旨在提升团队协作效率,确保代码质量。 1. **命名规范**:C++中的变量、函数、类等标识符应遵循清晰、简洁的命名规则。推荐使用驼峰式命名(CamelCase)或下划线连接命名(snake_...

    阿里代码规范13213.zip

    《阿里代码规范13213.pdf》是一个重要的资源,主要针对Java开发人员,旨在提供一套标准和指导原则,以确保代码的质量、可读性和可维护性。在Java开发过程中,遵循良好的编码规范至关重要,因为它有助于团队协作,...

    JAVA代码规范 JAVA规范 代码规范

    Java代码规范是编程实践中至关重要的一个方面,它旨在确保代码的质量、可读性和维护性。以下是一些核心的Java代码规范要点: 1. **命名规范**: - 类名使用大驼峰命名法,所有单词首字母大写,例如`ClassName`。 ...

    前端代码规范.rar

    在前端开发领域,代码规范是确保团队协作效率、提高代码可读性和维护性的关键。"前端代码规范"这个压缩包文件很可能包含了一系列关于如何编写整洁、一致且易于理解的前端代码的指南。以下是对这些规范的一些核心内容...

    这是借鉴、引用的是京东前端代码规范。

    这是借鉴、引用的是京东前端代码规范。

Global site tag (gtag.js) - Google Analytics