为了说明我的担忧,我将使用以下不完整的测试类:
import java.util.ArrayList;
public class Test
{
private int[] myArray = {1,2,3,4,5};
private ArrayList<Integer> myArrayList = new ArrayList<Integer>();
public int[] getMyArray()
{
int[] temp = new int[myArray.length];
for(int i = 0;i<myArray.length;++i)
{
temp[i] = this.myArray[i];
}
return temp;
}
public ArrayList<Integer> getMyArrayList()
{
ArrayList<Integer> temp = new ArrayList<Integer>();
for(int i = 0;i<myArrayList.size();++i)
{
temp.add(this.myArrayList.get(i));
}
return temp;
}
public void setMyArray(int[] newArray)
{
if(newArray.length!=myArray.length)
{
return;
}
for(int i = 0;i<myArray.length;++i)
{
this.myArray[i] = newArray[i];
}
}
public void setMyArrayList(ArrayList<Integer> newArrayList)
{
for(int i = 0;i<myArrayList.size();++i)
{
this.myArrayList.add(newArrayList.get(i));
}
}
}
我用上面的代码说明了分别为Arrays和ArrayLists实现getter和setter方法的正确方法吗?我假设最好在getter方法中返回Arrays和ArrayLists的副本,以及在setter方法中设置Array / ArrayLists中的每个单独元素。如果这不正确,请说明实施这些方法的正确方法。
答案 0 :(得分:4)
如果您认为有必要,可以为数组或ArrayLists实现getter和setter。
对于数组,有一个copyOf和copyOfRange方法可用于将数组复制到一个新数组而不是自己执行。
对于ArrayLists,有一个copy constructor,您可以使用它来构造一个包含指定集合元素的新ArrayList,而不是自己做,以及一个addAll方法来附加所有的指定集合中的元素到另一个列表的末尾。
至于:
我认为最好返回数组和副本 ArrayLists
再次取决于您是否认为有必要使数组或ArrayList不可变,这取决于您尝试实现的某些因素。
答案 1 :(得分:4)
这取决于你想要做什么,在某些情况下保持它有点不可变是有用的,这看起来像你想要的。您可以更简洁地编写方法。
private int[] myArray = {1,2,3,4,5};
private ArrayList<Integer> myArrayList = new ArrayList<Integer>();
public int[] getMyArray()
{
return Arrays.copyOf(myArray, myArray.length);
}
public ArrayList<Integer> getMyArrayList()
{
return new ArrayList<>(myArrayList);
}
public void setMyArray(int[] newArray)
{
this.myArray = Arrays.copyOf(newArray, newArray.length);
}
public void setMyArrayList(ArrayList<Integer> newArrayList)
{
this.myArrayList = new ArrayList<>(newArrayList);
}