【问题标题】:Proper Method for Implementing Getter and Setter methods for Arrays/ArrayLists为 Arrays/ArrayLists 实现 Getter 和 Setter 方法的正确方法
【发布时间】:2017-12-15 22:24:09
【问题描述】:

为了说明我的担忧,我将使用以下不完整的测试类:

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 中的每个单独元素。如果这是不正确的,请说明实现这些方法的正确方法。

【问题讨论】:

  • 你知道有一个copy constructoraddAll 而不是你自己做的。
  • 如果你想让这个类不可变,也一定要对你的元素进行深拷贝。

标签: java arrays arraylist


【解决方案1】:

这取决于你想要做什么,在某些情况下,让它保持不变是有用的,这看起来就像你想要的。您可以像这样更简洁地编写方法。

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);
}

【讨论】:

    【解决方案2】:

    如果您认为有必要,为数组或 ArrayList 实现 getter 和 setter 并没有什么坏处。

    对于数组,您可以使用copyOfcopyOfRange 方法将数组复制到新数组,而不是自己动手。

    对于 ArrayLists,有一个 copy constructor 可以用来构造一个包含指定集合元素的新 ArrayList,而不是自己做,还有一个 addAll 方法来附加指定集合中的所有元素集合到另一个列表的末尾。

    至于:

    我认为最好返回数组的副本和 数组列表

    这取决于您是否认为有必要使数组或 ArrayList 不可变,这取决于您要实现的某些因素。

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 2017-09-09
      • 2019-05-09
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多