“假如生活欺骗了你,不要悲伤,不要心急!忧郁的日子里须要镇静:相信吧,快乐的日子将会来临!—— 普希金”
内容概述
- 命名原则:4条命名原则;常量命名、变量命名、方法命名、类命名、接口命名、包命名;
- 命名强制性要求:语法规定;仅由字母、数字、_、$组成;
- 排版原则:缩进;断开长句;使用空行、空格;
命名原则
1.名称应该有实际意义
当我们为变量、方法、类或者常量命名的时候应该使用对阅读者来说是具有实际意义的名称,避免使用单个字母或者通用名。
我们首先来看下面这一段代码:
if (a < 65) {
y = 65 - a;
}
else {
y = 0;
}
在上面这段代码中,虽然我们能理清代码的执行过程,但是却不能判断出变量a和常数65的意义,这毫无疑问让我们很难理解这段代码的实际意义。
如果我们使用具有实际意义的名称来替换代码中的字母变量和常量,这段代码将十分容易理解。
if (age < RETIREMNT_AGE) {
yearsToRetirement = RETIREMNT_AGE - age;
}
else {
yearsToRetirement = 0;
}
这种命名规则有一个例外情况,就是临时变量的命名。
for (int i = 0; i < numberOfStudents; i++) {
enrollStudent(i);
}
临时变量的意义通过上下文的充足信息我们就可以判断出来,无需为其单独命名。
2.使用人们熟悉的名称
使用阅读者所熟悉的领域中的术语。如果阅读者习惯使用“customer”这个词,就不要使用“client”。当领域或者目标行业已经存在通用术语时,开发人员就不应该再采用非通用术语或者自己造新词。
3.谨慎使用过长的名称
如果类、接口、变量和方法的名称过长,那就说明这个实体的定义十分复杂。在给一个实体命名时,我们首先要考虑的是它的设计和用途,通过建立更具有针对性的类、接口、方法和变量来构成这些实体,并且给它们更简单有意义的名称。
4.不要使用只依赖大小写来区分的名字
虽然Java编译器可以区分那些大小写不同的名字,但是人在阅读时是很难注意到差别的,这就很容易对读者造成误导。
比如,变量theSQLInputStream和变量theSqlInputStream是不应该出现在同一个作用域的。
常量命名
常量的每个单词均大写,单词之间使用下划线连接。用大写字母命名常量可以和其他非final型变量相区分开。
class Byte {
public static final byte MAX_VALUE = 255;
public static final byte MIN_VALUE = 0;
}
变量命名
(1)使用名词来命名变量,变量名中的第一个单词小写,其后的每一个单词的第一个字母大写。
变量就是一个对象、事物,我们使用名称表示。大写能区分名词中的每一个单词,首字母小写则可以区分变量名和类名。
(2)集合引用名要使用复数形式
对象集合的字段和变量的名字要使用集合里包含的对象类型的复数形式,这便于区分多值变量和单值变量。
Customer[] customers = new Customer[MAX_CUSTOMERS];
void addCustomer(int index,Customer customer) {
this.customer[index] = customer;
}
Vector orderItems = new Vector();
void addOrderItems(OrdetItem orderItem) {
this.orderItems.addElement(orderItem);
}
(3)为不重要的临时变量建立一套标准名称
大多数变量的名字要使用完整的表述,但是也有很多经常出现的变量使用简写形式。
下面是几个比较常用的例子:
字符--------c,d,e
坐标--------x,y,z
异常--------e
图形--------g
对象--------o
流 ----------in,out
字符串-----s
(4)字段、参数命名
我们在使用构造方法或者set方法给字段赋值时,应该为参数名和字段使用相同名称,在方法内部使用this关键字来区分局部变量和字段变量。
class Student {
private String name;
public Student(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
}
方法命名
(1)使用动词命名方法,方法名中的第一个单词小写,其后的每个单词的第一个字母大写。
方法表示动作,采用动词命名。大写可以把名字里的各个单词很明确的区分开,首字母小写则可以将方法调用和构造方法区分开。
class Account {
private int balance;
public Account(int balance) {
this.balance = balance;
}
public void withdraw(int amount) {
deposit(-1 * amount);
}
public void deposit(int amount) {
this.balance += amount;
}
}
(2)遵循JavaBeans中属性访问函数的方法的命名规范
JavaBeans规范为方法建立了一套命名规范,用来访问JavaBeans实现的属性。在任何类中定义方法都应该使用这些规范,无论是否实现了Bean。
JavaBean用is开头的方法公开boolean属性:
boolean isValid() {
return this.isValid;
}
JavaBean用get开头的方法对其他属性进行访问:
string getName() {
return this.name;
}
JavaBean用set开头的方法对属性进行写入操作:
void setName() {
this.name = name;
}
类命名
采用名词命名类,类名中的每个单词的第一个字母大写。类用来定义对象或者事物,应该采用名词形式。大写可以明显地区分名字中各个单词,首字母大写则可以区分变量名以及类名或者接口名。
class CustomerAccount {
···
}
接口命名
采用名词或者形容词命名接口,接口中的每个单词的第一个字母大写。接口描述一个对象的能力或者使声明对象能够提供的服务。
a.使用名词给作为服务声明的接口命名:
public interface ActionListener {
public void actionPerformed(ActionEvent e);
}
b.使用形容词来为描述某种能力的接口命名:
public interface Runnable {
public void run();
}
大多数的接口命名都是采用形容词,这些形容词由动词加上able或者ible后缀得来。更能表示接口是表示一种能力的本质含义。
包命名
(1)使用单独的小写动词作为每个包的根名
包名里必须包含一个单独的小写词,能够清晰体现包的用途。包名也可以包含一个有实际意义的缩写,例如Java标准包的java.io。
(2)用你所在组织的域名的倒序小写的形式作为包名字的根限定词
例如,一个公司的域名为 weikanwave.com,该公司发布了一款名为server的服务器应用程序,那么该公司将该包命名为com.weikanwave.server。
强制性要求
1,组成:字母(a-zA-Z) 、数字(0-9) 、 下划线(_)、 美元符号($).
2,不能以数字开头;区分大小写;见名知意;不可关键字、保留字;
使用范式:
1,类名和接口名单词的首字母大写,其他字母小写;如RunTime.
2,变量名与方法名首单词全部小写,其他单词首字母大写,其他小写;如doCook();
3,包名全小写;
4,常量全部大写,单词间用_分割;如UP_DIRECTION;
实例:
12abc_ 不合法 数字不能开头
_12abc 合法
$ab12# 不合法 #号不属于标识符组成元素。
abc@123 不合法 @号不属于标识符组成元素。
排版原则
缩进嵌套的代码
1、如果我们使用开发环境,则我们可以使用开发环境提供的缩进样式。但是如果我们是手写代码,该使用两个空格缩进。
2、块语句起始端的大括号应该放在引入块语句那一行的最后,结束端的大括号要独占一行,并且与引入嵌套语句那一行的第一个字母对齐。
我们日常使用的代码规范如下:
类定义:
内部类定义:
方法定义:
void method(int j) {
···
}
功能体定义:
for循环语句:
for (int i = 0; i <= j; i++) {
···
}
if-else语句:
if (j < 0) {
···
}
else if ( j > 0) {
···
}
else {
···
}
try, catch, finally块:
try {
···
}
catch {
···
}
finally {
···
}
switch语句:
switch (value) {
case 0:
···
break;
default:
···
break;
}
while语句:
while (a < b) {
···
}
do-while语句:
do {
···
} while (a < b);
断开长句
尽管在窗口化的现代编辑器中,可以利用横向滚动条来阅读很长的单行代码。但是打印机对于超过它最大打印宽度的语句,就会把它们截断、换行或者打印在不同的页上。因此,要把每行代码的长度限制在打印环境所支持的最大宽度之内,这个值一般是80或者132个字符。
1、不要把多个语句放在同一行里以免超过最大可接受宽度。应该一条语句放置在一行里。
// 这样写太长
double x = Math.random(); double y = Math.random();
// 应该一句占一行
double x = Math.random();
double y = Math.random();
2、如果一行代码中包含了复杂的表达式,就应该把它拆分为几个短小的子表达式,每个子表达式的运算结果存储在一个临时变量里,并且单独放置在一行。
// 这样的表达式太长
double length = Math.sqrt(Math.pow(Math.random(),2.0),Math.pow(Math.random(),2.0));
// 应该按下面这样拆分
double x = Math.pow(Math.random(),2.0);
double y = Math.pow(Math.random(),2.0);
double length = Math.sqrt(x + y);
使用空白
空白就是页面上没有可见字符的区域。代码里如果空白太少就会不易阅读和理解,所以应该使用足够多的空白把方法、注释、代码块和表达式展示清楚。
1、以下情况使用单空白(也就是一个空格)来分隔:
(1)、右括号")"或者紧随其后的关键字、关键字和紧随其后的左括号"("或者"{"、右括号")"和紧随其后的左括号"{",
都要存在有一个空格,总而言之,括号和关键词之间有空格!
if (j < 0) { //括号与花括号之间是有个空格的;
···
}
else if ( j > 0) {
···
}
else {
···
}
(2)、除了"."的左右不用空格外,其他的运算符都要用空格间隔开来。
double length = Math.sqrt(x * x + y * y);
double x = length > 0.0 ? (x / length) : x;
2、以下情况应该使用空行来分隔:
(1) 每个逻辑上独立的方法实现之间
void handleInfo(Message message) {
DataInput content = message.getDataInput();
int messageType = content.readInt();
switch (messageType) {
case warning:
...
break;
case error:
...
break;
default:
...
break;
}
}
(2) 定义类或者接口时,每个成员之间使用空行
public class Car {
class InnerCar {
...
}
private Bar bar;
Foo(Bar bar) {
this.bar = bar;
}
}
(3) 源文件中,每个类和接口的定义之间要使用空行
interface Paly {
...
}
public class Person implements Play {
...
}