我有以下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
}
}
答案 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];
}
}
虽然,我强烈建议你重新考虑你的班级结构。