快速业务通道

审查Java代码的十一种常见错误 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
时的事情,尤其是在多线程环境中。

更好的方式是让getValues()返回拷贝:

public synchronized Dimension getValues(){ return new Dimension (d.x, d.y); }

现在,Example对象的内部状态就安全了。调用者可以根据需要改变它所得到的拷贝的状态,但是要修改Example对象的内部状态,必须通过setValues()才可以。

审查Java代码的十一种常见错误(2)

时间:2011-01-03

三、常见错误3#:不必要的克隆

我们现在知道了get方法应该返回内部数据对象的拷贝,而不是引用。但是,事情没有绝对:

/*** Example class.The value should never * be negative.*/ public class Example{   private Integer i = new Integer (0);   public Example (){ }   /*** Set x. x must be nonnegative* or an exception will be thrown*/   public synchronized void setValues (int x) throws IllegalArgumentException{    if (x < 0)     throw new IllegalArgumentException();     i = new Integer (x);   }   public synchronized Integer getValue(){    // We can’t clone Integers so we makea copy this way.    return new Integer (i.intValue());   } }

这段代码是安全的,但是就象在错误1#那样,又作了多余的工作。Integer对象,就象String对象那样,一旦被创建就是不可变的。因此,返回内部Integer对象,而不是它的拷贝,也是安全的。

方法getValue()应该被写为:

public synchronized Integer getValue(){ // ’i’ is immutable, so it is safe to return it instead of a copy. return i; }

Java程序比C++程序包含更多的不可变对象。JDK 所提供的若干不可变类包括:

·Boolean

·Byte

·Character

·Class

·Double

·Float

·Integer

·Long

·Short

·String

·大部分的Exception的子类

审查Java代码的十一种常见错误(3)

时间:2011-01-03

四、常见错误4# :自编代码来拷贝数组

Java允许你克隆数组,但是开发者通常会错误地编写如下的代码,问题在于如下的循环用三行做的事情,如果采用Object的clone方法用一行就可以完成:

public class Example{   private int[] copy;   /*** Save a copy of ’data’. ’data’ cannot be null.*/   public void saveCopy (int[] data){    copy = new int[data.length];    for (int i = 0; i < copy.length; ++i)     copy[i] = data[i];   } }

这段代码是正确的,但却不必要地复杂。saveCopy()的一个更好的实现是:

void saveCopy (int[] data){   try{    copy = (int[])data.clone();   }catch (CloneNotSupportedException e){    // Can’t get here.   } }

如果你经常克隆数组,编写如下的一个工具方法会是个好主意:

static int[] cloneArray (int[] data){   try{    return(int[])data.clone();   }catch(CloneNotSupportedException e){    // Can’t get here.   } }

这样的话,我们的saveCopy看起来就更简洁了:

void saveCopy (int[] data){   copy = cloneArray ( data); }

五、常见错误5#:拷贝错误的数据

有时候程序员知道必须返回一个拷贝,但是却不小心拷贝了错误的数据。由于仅仅做了部分的数据拷贝工作,下面的代码与程序员的意图有偏差:

import java.awt.Dimension; /*** Example class. The height and width values should never * be negative. */ public class Example{   static final public int TOTAL_VALUES = 10;   private Dimension[] d = new Di

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号