重读Core Java,记录点滴细节
时间:2010-07-18 来源:blessdyb
糊里糊涂地用了Java快三年多了,一直没有很系统地读过一本Java的经典书籍。借到一本<<Core Java ,8th>>,记下来自己在里面领悟到的细节点滴。
1. 抽奖程序算法。
很简单的一个应用,由于抽奖的结果不能出现重复。以前会每次来查看Math.Random()的结果是不是在已经抽出的列表中,如果有的话重新抽一次。看到书中巧妙的实现,很灵活。记录如下:
//抽奖的样本总量数组 int[] numers=new int[allSeek]; for(int i=0;i<numers.length;i++){ numers[i]=i+1; } //抽奖得到的结果存储数组 int[] result=new int[pickerSeek]; for(int i=0;i<result.length;i++){ //随机抽取 int r=(int)(Math.random()*allSeek); //存储抽奖结果 result[i]=numers[r]; //由于已经抽出一个,下次抽奖的问题将减一,将当前被抽出的位置的样本用样本问题中的最后一个样本值替换 numers[r]=numers[allSeek-1]; //抽奖样本问题减一 allSeek--; }
2. 封装中访问器的实现
特别注意不应该编写返回引用可变对象的访问器方法。这样的话会破坏类的封装性。如下代码
class Person{ private Date birthday; public Date getBirthday(){ return this.birthday; } }
初步来看的话,是没有问题的,但如果使用以下代码来访问:
Person p1=new Person(); Date birthday=p1.getBirthday(); birthday.setTime(birthday.getTime()-1);
此时,在我们去访问p1.getBirthday()时就会发现当前的birthday发生了变化。这是因为birthday与p1.birthday引用的是同一个可变对象。所以,我们如果需要返回一个可变对象的引用 ,就应用首先对它进行克隆(clone),如下代码:
class Person{ private Date birthday; public Date getBirthday(){ return (Date)this.birthday.clone(); } }
3. 基于类的访问权限
我们知道,方法可以访问所调用对象的私有数据。一个方法可以访问所属类的所有对象的私有数据,这点有点拗口,看下面的代码。
class Person{ private String name; public boolean equals(Person otherPerson){ return this.name.equals(otherPerson.name); } }
代码没什么问题,我们在使用中的一种典型的使用形式如下:
if(zhangsan.equals(boss)){ //zhangsan's name is the same as boss }
我们类方法中的代码在访问zhangsan的私有域name时没有问题。但是,它还访问了boss的私有域,有点奇怪。但这是合法的,它的原因是boss是Person类的对象,而Person类的方法可以访问Person类的任何一个对象 的私有域。