0

我有以下 ArrayIntList 类,其构造函数定义如下。在最后一个构造函数中,我想要布尔值,如果为真,则实例化一个包含该特定元素的新对象。如果设置为 false,它应该只实例化一个具有那么多容量的新对象。请查看客户端代码以了解我的意思。它在布尔值为真时起作用。

类文件:

public class ArrayIntList {
    private int[] elementData; // list of integers
    private int size;          // current number of elements in the list

    public static final int DEFAULT_CAPACITY = 100;

    // post: constructs an empty list of default capacity
    public ArrayIntList() {
        this(DEFAULT_CAPACITY);
    }

    // pre : capacity >= 0 (throws IllegalArgumentException if not)
    // post: constructs an empty list with the given capacity
    public ArrayIntList(int capacity) {
        if (capacity < 0) {
            throw new IllegalArgumentException("capacity: " + capacity);
        }
        elementData = new int[capacity];
        size = 0;
    }

    //takes input list and adds to arrayIntList
    public ArrayIntList(int[] elements) {
      this(Math.max(DEFAULT_CAPACITY,elements.length*2));
      for (int n: elements){
         this.add(n);
      }
    }

    //creates an arrayIntlist with data of element
    public ArrayIntList(int element,boolean notCapacity) {
      this();
      if (notCapacity) {
         add(element);
      }
   //returns the totalCapacity NOT SIZE
    public int getCapacity() {
  return elementData.length;
    }
}

客户端代码:

public class ArrayIntListExample {
    public static void main(String[] args) {
        // Create a new list and add some things to it.
        ArrayIntList list = new ArrayIntList();

        //*** here is my question about ****//
        ArrayIntList list1 = new ArrayIntList(2, false);//should give [] with capacity of two
        ArrayIntList list2 = new ArrayIntList(2, true);//should give [2] 
        //*** ****************************** ****//
        int[] array={2,3,4,5};
        ArrayIntList list3 = new ArrayIntList(array);
        list.add(12);
        list.add(3);
        list.add(3);
        System.out.println("list = " + list);
        System.out.println("list1 = " + list1);
        System.out.println("list2 = " + list2);
        System.out.println("list2 = " + list3);
        System.out.println("capacity of list1" + list1.getCapacity());//prints 100 but it must be 2
    }
}
4

4 回答 4

3

为了让它按照你想要的方式运行,我想你想element用唯一的int参数传递给构造函数:

public ArrayIntList(int element, boolean notCapacity) {
    this(element);
    if (notCapacity) {
         add(element);
    }
}

以前您只是调用this(),它使用默认容量初始化数组。如果您手动或使用调试器单步执行代码,您会看到这种情况发生。

但是,您的设计还有其他问题。除了笨拙且令人困惑的接口/API(通过您的构造函数)之外,数组的容量(即它可以容纳的元素总数)和它的大小(即数组中的元素数)之间也存在差异。当前数组)。

编辑

您的 API 令人困惑的原因之一是您有以下情况:

-------------------------------------------------------------------
Constructor            | int | boolean | Behavior
-----------------------+-----+---------+---------------------------
(element)              |  2  |    x    | Array with capacity 2
(element, notCapacity) |  2  |  true   | Array with one element (2)
(element, notCapacity) |  2  |  false  | Array with capacity 2
-----------------------+-----+---------+---------------------------
  • 你有两种方法可以做同样的事情。
  • 您有一个boolean被赋予否定名称的参数。比“notCapacity 为假”更容易理解“容量为假”的含义。
  • 您引入了一个具有有限值的特性(用一个任意值的元素初始化一个数组),同时引入了不一致和混乱。本质上,唯一的notCapacity作用是区分您想要的两种行为(使用容量初始化与使用任意值的一个元素初始化)。
  • element有两个非常不同的含义:容量与要添加到数组中的单个元素。
  • 更改falsetotrue足以从构造函数调用截然不同的行为。
  • 构造函数中的布尔值通常是不透明的并且价值有限。从看到这样的调用来看new ArrayIntList(5, true),意图是否明显?
于 2013-07-11T21:25:19.633 回答
2

让我们看看你的构造函数:

public ArrayIntList(int element,boolean notCapacity) {
  this();
  if (notCapacity) {
     add(element);
  }
}

现在让我们看看这一行:

this();

此行将不带参数调用您的构造函数。该构造函数如下所示:

public ArrayIntList() {
    this(DEFAULT_CAPACITY);
}

因此,这将调用具有容量的构造函数,并将 DEFAULT_CAPACITY 传递给它。所以在原文中添加一些注释:

public ArrayIntList(int element,boolean notCapacity) {

  this(); // initializes this object with a capacity of 100 and no elements

  if (notCapacity) {
     add(element); // if notCapacity is true, add the element
  }
}

如您所见,如果 notCapacity 为假(意味着它应该是容量),您实际上在任何地方都没有使用“元素”变量。

一个非常简单的解决方法可能是:

public ArrayIntList(int element,boolean notCapacity) {

  this(notCapacity ? DEFAULT_CAPACITY : element);

  if (notCapacity) {
     add(element);
  }
}

但是,我认为更好的设计是根本没有这个构造函数,而是提供以下静态方法:

public static ArrayIntList createWithElement(int element) {
    ArrayIntList ret = new ArrayIntList();
    ret.add(element);
    return ret;
}

然后调用者有一个干净清晰的方法来调用以创建一个包含 1 个元素的列表。

于 2013-07-11T21:26:12.503 回答
0

这应该可行,但我认为您的 API 令人困惑..

public ArrayIntList(int element,boolean startElement) {
  this(startElement ? 1 : element);
  if (startElement) {
     add(element);
  }
}

我认为您应该删除此构造函数,而让用户new ArrayIntList(new int[] { 2 })在他们想要一个包含特定元素的列表时这样做。

于 2013-07-11T21:25:17.787 回答
0

如果您按照代码进行操作,就会清楚为什么会发生这种行为。

public ArrayIntList(int element,boolean notCapacity) {
  this();
  if (notCapacity) {
     add(element);
  }
}

此方法将创建一个新的 Array,DEFAULT_CAPACITY如果它为 false,它只会完成该方法并返回而无需执行任何其他操作。

最简单的解决方案就是添加这样的 else 语句:

public ArrayIntList(int element,boolean notCapacity) {
  this();
  if (notCapacity) {
     add(element);
  } else {
     elementData = new int[element];
  }
}

虽然,我强烈建议你重新考虑你的班级结构。

于 2013-07-11T21:26:04.627 回答