Java平台(其实整个编程界)有着一套很好的命名惯例。所谓惯例,可以理解为“约定俗成”。类似我们常见的《命名规则》《编码规则》《SQL文规则》等,经过提炼,可以基本看出里面的“规律”。
“约定”对于编程来说,意义远大于在其他领域。在Rails中,甚至是“约定大于配置”的。
具体到Java的一系列命名惯例,首先是包名。和.Net中的namespace类似,Java中的package是为了区别不同人、不同公司编写的可能名字相同的类用的,其实这句话应该反着说,因为是Java首先这么用的。而且和MS对namespace的无推荐不同,Sun推荐包名按照域名的逆序来书写,而且全是小写字母,每一层尽量是一个英文单词(名词最好)。尽量一个单词,而且尽量不大于8个字母,所以鼓励使用缩写。例如,使用util而不是utilities(有人也用utils)
2)类和接口(接口其实也是类,Java中万物皆类)的名字采用 Pascal命名法,即每个单词的首字母均大写,各个单词间无连接符。对于一些英文缩写,也推荐除首字母以外都小写。如,HttpUrl,而不是HTTPURL。这里尤其要注意的是仅有两个字母的缩写,如IO,ID,IP(呵呵,碰巧都是I字辈的),最好还是写成 DiskIo,UserId,TerminalIp。
3)类成员(属性和方法)名、局部变量名要用 驼峰命名法,即除首单词的首字母要小写外,其他同Pascal命名法。(这一点和.Net不同,.Net中除私有类成员外,都是Pascal命名法)
4)常量,用全大写,各个单词见用下划线“_”相连接。
5)getter/setter方法,getter/setter其实就是普通的方法,只是一种特定用途罢了。它们用于将被封装的私有属性对外提供访问的方法。通常是在属性名的前面加上 get 和 set ,再将属性名的首字母变大写。
这里的一个特殊地方是boolean型变量,除了之上的方法,也可以把 get 改为 is,如果属性名本身已经是以 is 开头了,就省掉这个 is 。这是 JavaBean 的规范,广义上讲,也可以用一个名词或名词短语,如:size,hashCode
(补充一点:C# VB.Net AS3 都有自己的“属性”语法,有人指为语法糖,但也不失为是一种使用更简单的方式,其本质还是和 Java”标准的”getter/setter 一样的,总之是对私有属性的封装)
6)特殊方法和属性:
静态工厂方法(见【第1条】):valueOf 和 getInstance 前者广泛用于对值类的类型转换,后者则出现在非值类的单例模式中
类型转换方法:toType,如 toString,toArray
返回当前对象的一个不同的视图:asType,如:asList,常用 Arrays.asList() 来将数组转换成List
一些省略了开头的“is”的boolean型属性,如 initialized 和 composite
一些常用的通用属性,如:height,digits,size 等
一些常用的通用方法,如:flush(),isEmpty() 等
7)在对英文单词的选择上,也尽量复合大多数人的习惯。
避免使用一些蹩脚的单词,而是使用常见的单词,而且最好是其他人也大多使用的单词。在对两个单词模棱两可时,可以在Javadoc中搜索一下,看看哪一个被类库使用的更多。例如,当你拿不定主意用 delete 还是 remove 时,到Javadoc中搜一下,你会发现 remove 的出现次数远比 delete 要多得多,可能仅仅是在物理上删除如文件或数据库中的记录的时候才用delete,一般对变量中内容的删除都使用remove。
总之,把标准的命名规则变成自己的习惯是一件可以受益匪浅的事情。就在我写这条笔记之前的几个小时,我在百度知道上回答了一个网友的提问。且不说问题的具体内容,但看他的命名就有问题:
public static String getDate(String sign,Date date,int day){
如果他真的是要得到一个 String 类型的返回值,这里就不应该使用 getDate 这个名字,这样会产生误会的。
下一章,就要讲到Exception了,这是比较深的一章,最近手上的工作还是比较多的,可能《笔记》会暂停2-3天,一方面是抓紧一下工作,另一方面,也要前后连贯地再好好研习一下《第8章 异常》
【Effective Java 学习笔记】系列连载专题请见:
http://tonylian.iteye.com/categories/64208