DANCE WITH JAVA

开发出高质量的系统

常用链接

统计

积分与排名

好友之家

最新评论

Effective Java 27-30

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

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

//        while循环
        
        Iterator ie1 
= list1.iterator();
        
while(ie1.hasNext()){
            doSomething(ie1.next());
        }

        Iterator ie2 
= list2.iterator();
        
while(ie1.hasNext()){     //bug
            doSomething(ie2.next());
        }
这个问题源于复制粘贴,在编码的过程中复制粘贴几乎是不可避免的,使用for循环当你出错的时候可以在编译器发生错误,而使用while则不会发现。尽早发现错误总是好的。
三十、了解和使用库(产生随机数)
详细:如果你希望产生一个位于0-某个上界的随机数,大多数的人的写法如下
static Random rnd = new Random();
    
static int random(int n){
        
return Math.abs(rnd.nextInt())%n;
    }
这个方法存在三个缺点:
缺点一:
如果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)

posted on 2007-02-11 01:03 dreamstone 阅读(1482) 评论(0)  编辑  收藏 所属分类: jdk相关


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问