naming.rst 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. 5. 命名
  2. ----------------
  3. 5.1. 所有标识符通用的规则
  4. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  5. 标识符只使用ASCII字母、数字以及在下面提到的极少数情况中才会使用的下划线。因此,每个有效的标识符名称都应与正则表达式 ``\w+`` 匹配。
  6. 在Google风格中, **不** 使用特殊的前缀或后缀。例如,以下都不是Google风格的命名: ``name_`` , ``mName`` , ``s_name`` 和 ``kName`` 。
  7. 5.2. 不同类型标识符的规则
  8. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  9. 5.2.1. 包名
  10. """"""""""""""""""""""""""""""""""""""""""""""""""
  11. 包名只使用小写字母和数字(不使用下划线)。连续的单词直接连接在一起。例如 ``com.example.deepspace`` ,而不是 ``com.example.deepSpace`` 或 ``com.example.deep_space`` 。
  12. .. _class-names:
  13. 5.2.2. 类名
  14. """"""""""""""""""""""""""""""""""""""""""""""""""
  15. 类名使用 :ref:`大驼峰命名法(UpperCamelCase) <camel-case>` 。
  16. 类名通常是名词或名词短语。例如 ``Character`` 、 ``ImmutableList`` 。接口名称也可能是名词或名词短语(例如 ``List`` ),但有时可能是形容词或形容词短语(例如 ``Readable`` )。
  17. 对于注解的命名,至今还没有具体的规则,甚至也没有任何不成文的规定。
  18. 测试类的名称以 ``Test`` 结尾,例如, ``HashIntegrationTest`` 。如果它覆盖一个单一的类,其名称是该类的名称后加上 ``Test``,例如 ``HashImplTest`` 。
  19. 5.2.3. 方法名
  20. """"""""""""""""""""""""""""""""""""""""""""""""""
  21. 方法名使用 :ref:`小驼峰命名法(lowerCamelCase) <camel-case>` 。
  22. 方法名通常是动词或动词短语。例如 ``sendMessage`` 、 ``stop`` 。
  23. 在JUnit测试方法名中,可以使用下划线来分隔名称的逻辑组件,每个组件都使用 :ref:`小驼峰命名法 <camel-case>` 编写,例如 ``transferMoney_deductsFromSource`` 。命名测试方法没有唯一正确的方式。
  24. 5.2.4. 常量字段名
  25. """"""""""""""""""""""""""""""""""""""""""""""""""
  26. 常量名使用 ``UPPER_SNAKE_CASE`` (大蛇式):全部为大写字母,每个单词之间用单个下划线分隔。但是,什么才算是一个常量呢?
  27. 常量是指那些由 ``static final`` 修饰的字段,其内容是深度不可变(译者注:指该对象以及其内部所有可能的引用或对象都是不可变的,与“浅层不可变”相对)的,且其方法不会产生可检测到的副作用。例子包括基本数据类型、字符串、不可变的值类和设置为 ``null`` 的任何东西。如果实例的任何可观察状态可以被改变,那它就不是一个常量。仅有不改变对象的意图是不够的。例如:
  28. .. code-block:: java
  29. // Constants
  30. static final int NUMBER = 5;
  31. static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
  32. static final Map<String, Integer> AGES = ImmutableMap.of("Ed", 35, "Ann", 32);
  33. static final Joiner COMMA_JOINER = Joiner.on(','); // because Joiner is immutable
  34. static final SomeMutableType[] EMPTY_ARRAY = {};
  35. // Not constants
  36. static String nonFinal = "non-final";
  37. final String nonStatic = "non-static";
  38. static final Set<String> mutableCollection = new HashSet<String>();
  39. static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);
  40. static final ImmutableMap<String, SomeMutableType> mutableValues =
  41. ImmutableMap.of("Ed", mutableInstance, "Ann", mutableInstance2);
  42. static final Logger logger = Logger.getLogger(MyClass.getName());
  43. static final String[] nonEmptyArray = {"these", "can", "change"};
  44. 常量名通常是名词或名词短语。
  45. 5.2.5. 非常量字段名
  46. """"""""""""""""""""""""""""""""""""""""""""""""""
  47. 非常量字段名,无论其是否为静态的,都使用 :ref:`小驼峰命名法 <camel-case>` 格式编写。
  48. 非常量字段名通常是名词或名词短语。例如, ``computedValues`` 或 ``index`` 。
  49. 5.2.6. 参数名
  50. """"""""""""""""""""""""""""""""""""""""""""""""""
  51. 参数名使用 :ref:`小驼峰命名法 <camel-case>` 格式编写。
  52. 公共( ``public``)方法中应避免使用单字符参数名。
  53. 5.2.7. 局部变量名
  54. """"""""""""""""""""""""""""""""""""""""""""""""""
  55. 局部变量名使用 :ref:`小驼峰命名法 <camel-case>` 格式编写。
  56. 即使是 final 且不可变的,局部变量也不被视为常量,因此不应按常量的风格命名。
  57. 5.2.8. 类型变量名
  58. """"""""""""""""""""""""""""""""""""""""""""""""""
  59. 每个类型变量的命名方式有两种:
  60. - 单个大写字母,后面可选择性地跟一个数字(如 ``E`` , ``T`` , ``X`` , ``T2`` )
  61. - 按照类的命名方式命名(参见第5.2.2节,:ref:`类名 <class-names>`),然后跟一个大写字母 ``T`` (例如: ``RequestT`` , ``FooBarT`` )。
  62. .. _camel-case:
  63. 5.3. 驼峰命名法:明确规定
  64. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  65. 有时将英文短语转换为驼峰命名有多种合理的方式,例如当存在缩略词或如"IPv6"或"iOS"这样不寻常的结构时。为了提高可预测性,Google风格指定了以下的(几乎)明确的规定。
  66. 从名称的口头表达开始:
  67. - 1. 将短语转换为纯ASCII并去除所有的撇号。例如,“Müller's algorithm”可能变为“Muellers algorithm”。
  68. - 2. 将这个结果分割为单词,以空格和任何剩余的标点符号(通常是连字符)为分隔。
  69. - 推荐:如果任何单词在常见用法中已经有一个传统的驼峰命名形式,那么将其分割成其组成部分(例如,"AdWords"变为"ad words")。注意,像"iOS"这样的单词并不真的是驼峰命名,实际上它违反了任何惯例,所以这个建议不再适用。
  70. - 3. 现在将所有内容(包括缩略词)全部转为小写,然后只将:
  71. - ... 每个单词的第一个字母大写,得到大驼峰命名,或
  72. - ... 除第一个单词外的每个单词的第一个字母大写,得到小驼峰命名
  73. - 4. 最后,将所有的单词连接成一个标识符。
  74. 注意,原始单词的大小写几乎完全被忽略。示例:
  75. ============================================================ ============================================================ ============================================================
  76. 口头表达 正确形式 错误形式
  77. ============================================================ ============================================================ ============================================================
  78. "XML HTTP request" ``XmlHttpRequest`` ``XMLHTTPRequest``
  79. "new customer ID" ``newCustomerId`` ``newCustomerID``
  80. "inner stopwatch" ``innerStopwatch`` ``innerStopWatch``
  81. "supports IPv6 on iOS?" ``supportsIpv6OnIos`` ``supportsIPv6OnIOS``
  82. "YouTube importer" ``YouTubeImporter`` 、 ``YoutubeImporter`` *
  83. ============================================================ ============================================================ ============================================================
  84. \*可以接受,但不推荐。
  85. .. tip::
  86. **注意:** 在英文中,有些单词的连字符使用是模糊的:例如,“nonempty”和“non-empty”都是正确的,因此方法名 ``checkNonempty`` 和 ``checkNonEmpty`` 同样都是正确的。