【前面的话】
年后开始正式上班,计划着想做很多事情,但是总会有这样那样的打扰,不知道是自己要求太高还是自我的奋斗意识不够?接下来好好加油。好好学学技术,好好学习英语,好好学习做点自己喜欢的事情,趁着自己还是一个人。
如果你想要学习关于编码风格方面的知识,建议直接阅读参考资料中的文章,比看我这里写的好多了,这是真心话,我只是写自己的笔记。便于自己在以后的编码中注意。
【问题背景】
在做开发工作的时候,总是被说编码风格不好,现在自己找了Google Java编程风格指南进行学习,希望可以写出清晰的代码。
【学习资料】
Google Java编程风格指南,作者:Hawstein
http://hawstein.com/posts/google-java-style.html
【知识汇总】
十、几个具体结构:
1. 枚举类
- 枚举常量间用逗号隔开,换行可选。
- 没有方法和文档的枚举类可写成数组初始化的格式:
private enum Suit { CLUBS, HEARTS, SPADES, DIAMONDS }
- 由于枚举类也是一个类,因此所有适用于其它类的格式规则也适用于枚举类
2. 变量声明
- 每次只声明一个变量
- 需要时才声明,并尽快进行初始化
3. 数组
- 数组初始化:可写成块状结构——下面的都可以。
new int[] {
0, 1, 2, 3
} new int[] {
0,
1,
2,
3
} new int[] {
0, 1,
2, 3
} new int[]
{0, 1, 2, 3}
- 非C风格的数组声明——中括号是类型的一部分:
String[] args
, 而非String args[]
。
4. switch语句——switch块的大括号内是一个或多个语句组。每个语句组包含一个或多个switch标签(case FOO:
或default:
),后面跟着一条或多条语句。
- 缩进:
与其它块状结构一致,switch块中的内容缩进为2个空格。每个switch标签后新起一行,再缩进2个空格,写下一条或多条语句。
- Fall-through:注释
在一个switch块内,每个语句组要么通过break, continue, return
或抛出异常来终止,要么通过一条注释来说明程序将继续执行到下一个语句组,任何能表达这个意思的注释都是OK的(典型的是用// fall through
)。这个特殊的注释并不需要在最后一个语句组(一般是default
)中出现。
- 示例:
switch (input) {
case 1:
case 2:
prepareOneOrTwo();
// fall through
case 3:
handleOneTwoOrThree();
break;
default:
handleLargeNumber(input);
}
- default的情况要写出来——每个switch语句都包含一个default语句组,即使它什么代码也不包含。
5. 注解(Annotations)
- 注解紧跟在文档块后面,应用于类、方法和构造函数,一个注解独占一行
@Override
@Nullable
public String getNameIfPresent() { ... }
- 例外:单个的注解可以和签名的第一行出现在同一行。例如:
@Override public int hashCode() { ... }
- 应用于字段的注解紧随文档块出现,应用于字段的多个注解允许与字段出现在同一行。例如:
@Partial @Mock DataLoader loader;
参数和局部变量注解没有特定规则。
6. 注释
- 块注释风格
块注释与其周围的代码在同一缩进级别。它们可以是/* ... */风格,也可以是// ...风格。对于多行的/* ... */注释,后续行必须从*开始,并且与前一行的*对齐。以下示例注释都是OK的。
/*
* This is // And so /* Or you can
* okay. // is this. * even do this. */
*/
7. Modifiers
类和成员的modifiers如果存在,则按Java语言规范中推荐的顺序出现。
public protected private abstract static final transient volatile synchronized native strictfp
十一、命名规则
1. 对所有标识符都通用的规则
- 标识符只能使用ASCII字母和数字,因此每个有效的标识符名称都能匹配正则表达式\w+。
- 在Google其它编程语言风格中使用的特殊前缀或后缀,如name_, mName, s_name和kName,在Java编程风格中都不再使用。
2. 标识符类型的规则
- 包名——包名全部小写,连续的单词只是简单地连接起来,不使用下划线
- 类名
- 类名都以UpperCamelCase(第一个词的首字母,以及后面每个词的首字母都大写,叫做“大骆驼拼写法”)风格编写。
- 类名通常是名词或名词短语,接口名称有时可能是形容词或形容词短语。现在还没有特定的规则或行之有效的约定来命名注解类型。
- 测试类的命名以它要测试的类的名称开始,以Test结束。例如,HashTest或HashIntegrationTest。
- 方法名
- 方法名都以lowerCamelCase(第一个词的首字母小写,后面每个词的首字母大写,叫做“小骆驼拼写法”)风格编写。
- 方法名通常是动词或动词短语。
- 下划线可能出现在JUnit测试方法名称中用以分隔名称的逻辑组件。一个典型的模式是:test<MethodUnderTest>_<state>,例如testPop_emptyStack。并不存在唯一正确的方式来命名测试方法。
- 常量名
- 常量名命名模式为CONSTANT_CASE,全部字母大写,用下划线分隔单词。那,到底什么算是一个常量?
- 每个常量都是一个静态final字段,但不是所有静态final字段都是常量。在决定一个字段是否是一个常量时,考虑它是否真的感觉像是一个常量。例如,如果任何一个该实例的观测状态是可变的,则它几乎肯定不会是一个常量。只是永远不打算改变对象一般是不够的,它要真的一直不变才能将它示为常量。
// Constants
static final int NUMBER = 5;
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
static final Joiner COMMA_JOINER = Joiner.on(','); // because Joiner is immutable
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT } // Not constants
static String nonFinal = "non-final";
final String nonStatic = "non-static";
static final Set<String> mutableCollection = new HashSet<String>();
static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};
- 非常量字段名——非常量字段名以
lowerCamelCase
风格编写。 - 参数名——参数名以lowerCamelCase风格编写。参数应该避免用单个字符命名。
- 局部变量名
- 局部变量名以lowerCamelCase风格编写,比起其它类型的名称,局部变量名可以有更为宽松的缩写。
- 虽然缩写更宽松,但还是要避免用单字符进行命名,除了临时变量和循环变量。
- 即使局部变量是final和不可改变的,也不应该把它示为常量,自然也不能用常量的规则去命名它。
- 类型变量名
- 单个的大写字母,后面可以跟一个数字(如:E, T, X, T2)。
- 以类命名方式,后面加个大写的T(如:RequestT, FooBarT)。
3. 驼峰式命名法——驼峰式命名法分大驼峰式命名法(UpperCamelCase
)和小驼峰式命名法(lowerCamelCase
)。有时,我们有不只一种合理的方式将一个英语词组转换成驼峰形式,如缩略语或不寻常的结构(例如"IPv6"或"iOS")。Google指定了以下的转换方案。
- 把短语转换为纯ASCII码,并且移除任何单引号。例如:"Müller’s algorithm"将变成"Muellers algorithm"。
- 把这个结果切分成单词,在空格或其它标点符号(通常是连字符)处分割开。
- 现在将所有字母都小写(包括缩写),然后将单词的第一个字母大写:
- 每个单词的第一个字母都大写,来得到大驼峰式命名。‘
- 除了第一个单词,每个单词的第一个字母都大写,来得到小驼峰式命名。
- 最后将所有的单词连接起来得到一个标识符。
举例:
Prose form Correct Incorrect
------------------------------------------------------------------
"XML HTTP request" XmlHttpRequest XMLHTTPRequest
"new customer ID" newCustomerId newCustomerID
"inner stopwatch" innerStopwatch innerStopWatch
"supports IPv6 on iOS?" supportsIpv6OnIos supportsIPv6OnIOS
"YouTube importer" YouTubeImporter
未完待续,见下一篇文章。。。。。。
【后面的话】
做舅舅了,哈哈哈哈。。。。。。。。。。。
——TT