解析Java代码经常出现的错误(2)
来源:IT的点点滴滴 责任编辑:栏目编辑 发表时间:2013-07-01 12:29 点击:次
五、常见错误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 Dimension[TOTAL_VALUES];
- public Example (){ }
- /*** Set height and width. Both height and width must be nonnegative * or
- an exception will be thrown. */
- public synchronized void setValues (int index, int height, int width)
- throws IllegalArgumentException{
- if (height < 0 || width < 0)
- throw new IllegalArgumentException();
- if (d[index] == null)
- d[index] = new Dimension();
- d[index].height = height;
- d[index].width = width;
- }
- public synchronized Dimension[] getValues()
- throws CloneNotSupportedException{
- return (Dimension[])d.clone();
- }
- }
这儿的问题在于getValues()方法仅仅克隆了数组,而没有克隆数组中包含的Dimension对象,因此,虽然调用者无法改变内部的数组使其元素指向不同的Dimension对象,但是调用者却可以改变内部的数组元素(也就是Dimension对象)的内容。方法getValues()的更好版本为:
- public synchronized Dimension[] getValues() throws CloneNotSupportedException{
- Dimension[] copy = (Dimension[])d.clone();
- for (int i = 0; i < copy.length; ++i){
- // NOTE: Dimension isn’t cloneable.
- if (d != null)
- copy[i] = new Dimension (d[i].height, d[i].width);
- }
- return copy; <
相关新闻>>
- 发表评论
-
- 最新评论 更多>>