Java开发程序员必知的Java编程的10种错误

发表于:2011-2-24 10:06

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:kaduo    来源:51Testing软件测试网采编

分享:

  现在,Example对象拥有负值了!如果getValues() 的调用者永远也不设置返回的Dimension对象的width 和height值,那么仅凭测试是不可能检测到这类的错误。

  不幸的是,随着时间的推移,客户代码可能会改变返回的Dimension对象的值,这个时候,追寻错误的根源是件枯燥且费时的事情,尤其是在多线程环境中。

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

  •  public synchronized Dimension getValues()...{  
  •  return new Dimension (d.x, d.y);  
  •  }
  •   现在,Example对象的内部状态就安全了。调用者可以根据需要改变它所得到的拷贝的状态,但是要修改Example对象的内部状态,必须通过setValues()才可以。

      三、常见错误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的子类
  •   四、常见错误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[i] = data[i];  
  • }  
  • }
  • 52/5<12345>
    100家互联网大公司java笔试题汇总,填问卷领取~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号