Effective Java 27-30

二十七、使用零长度数组代替Null作为返回值
原因:返回Null会造成使用者每次使用的时候都要作一次判断,但有人会说返回一个零长度数组会产生new的开销,不如Null性能好。这个不是一定的,因为我们可以这样来作
private final static Cheese[]  NULL_CHESE_ARRAY = new Cheese[0];
每次需要的时候返回这个数组就好了。

二十八、为所有的导出Api元素编写文档注释
二十九、使一个局部变量的作用域最小化,最好的办法使在第一次使用的时候声明
1,几乎每一个局部变量的声明都应该包含一个初始化表达式,如果你还没有足够的信息来初始化那就推迟声明。
2,for循环优先于while循环,见下边的例子
None.gif //         for循环
ExpandedBlockStart.gifContractedBlock.gif
         for (Iterator ie  =  list.iterator();ie.hasNext()) dot.gif {
InBlock.gif            doSomething(ie.next());
ExpandedBlockEnd.gif        }

None.gif
//         while循环
None.gif
        
None.gif        Iterator ie1 
=  list1.iterator();
ExpandedBlockStart.gifContractedBlock.gif        
while (ie1.hasNext()) dot.gif {
InBlock.gif            doSomething(ie1.next());
ExpandedBlockEnd.gif        }

None.gif        Iterator ie2 
=  list2.iterator();
ExpandedBlockStart.gifContractedBlock.gif        
while (ie1.hasNext()) dot.gif {     //bug
InBlock.gif
            doSomething(ie2.next());
ExpandedBlockEnd.gif        }
这个问题源于复制粘贴,在编码的过程中复制粘贴几乎是不可避免的,使用for循环当你出错的时候可以在编译器发生错误,而使用while则不会发现。尽早发现错误总是好的。
三十、了解和使用库(产生随机数)
详细:如果你希望产生一个位于0-某个上界的随机数,大多数的人的写法如下
None.gif static  Random rnd  =   new  Random();
ExpandedBlockStart.gifContractedBlock.gif    
static   int  random( int  n) dot.gif {
InBlock.gif        
return Math.abs(rnd.nextInt())%n;
ExpandedBlockEnd.gif    }
这个方法存在三个缺点:
缺点一:
如果n是一个比较小的2的乘方 那么经过一段相当短的周期后它产生的随即数序列将会重复
缺点二:
如果n不是2的乘方,那么平均起来某些数比另外一些数出现的更为频繁,如果n比较大则这个问题更加显著如果产生100万范围内的随机数,你会发现数字几乎全部在0-666 666 ,前2/3的数字
缺点三:
在有些情况下会灾难性失败,返回一个落在范围之外的数字。原因是使用了Math.abs来得到一个非负数。
如果nextInt()返回 Integer.MIN_VALUE,那么abs后也会返回Integer.MIN_VALUE ,假设n不是2的乘方,那么取模操作符%将返回一个负数,这几乎肯定造成你的程序失败,而且这个失败很难重现。

为了编写一个避免上边三个缺点的random,你必须了解线性同于伪随机发生器、数论、和2的求补运算知识。不过Jdk已经实现了一个现成的可以使用,那就是Random.nextInt(int)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值