我班级的构造函数不起作用

时间:2013-07-11 21:15:10

标签: java arrays list constructor

我有以下ArrayIntList类,其构造函数定义如下。在最后一个构造函数中,我想要boolean,如果为true,则实例化一个具有该特定元素的新对象。如果设置为false,它应该只实例化具有该许多容量的新对象。请仔细查看客户端代码,了解我的意思。它在boolean为true时有效。

课程文件:

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 个答案:

答案 0 :(得分: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 is false”。
  • 您引入了一个值有限的功能(使用一个任意值的元素初始化数组),同时引入了不一致和混淆。基本上notCapacity所服务的唯一一点就是区分你想要的两种行为(用容量初始化与用一个任意值的元素初始化)。
  • element有两个非常不同的含义:容量与要添加到数组中的单个元素。
  • false更改为true足以从构造函数中调用异常不同的行为。
  • 构造函数中的布尔值通常是不透明的,价值有限。从看到像new ArrayIntList(5, true)这样的调用,意图是否明显?

答案 1 :(得分: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为false(意味着它应该是容量),那么您实际上没有使用“element”变量。

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

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个元素的列表。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

如果您仔细阅读代码,则可以清楚地了解行为发生的原因。

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

此方法将创建一个新的DEFAULT_CAPACITY数组,如果为false,它只会完成方法并返回而不做任何其他操作。

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

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

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