我是Java的新手。 我想创建一个有界堆栈,用户可以在构造函数中选择他想要的数组(堆栈)中的元素数量。我的堆栈是一个对象数组。 我创造了这样的东西:
public class BoundedStack {
int Size;
java.lang.Object[] List;
public BoundedStack(int size) {
this.Size = size;
}
如果我创建BoundedStack类的实例会很酷,类型对象的数组将在构造函数中使用Paramater的大小创建。 (int size
)。
如果用户不想在构造函数中输入数字,只需声明类BoundedStack
的实例。 List数组的默认值应为32个元素。
有些东西在这里没有用。我必须使用2个构造函数吗?一个参数和一个没有?我知道构造函数并不难编码......但有些东西已经过去了。我的想法是通过实例化大小和数组......
有谁知道如何解决这个问题?
答案 0 :(得分:3)
是的,两个构造函数。人们应该采取一个大小的论点;另一个应该不参数,并且应该使用this(32);
推迟到另一个,以获得默认大小32。
顺便说一句,LinkedBlockingDeque
将是使用标准JDK类实现它的方法。
此外,您可能希望更改术语。通常 capacity 将是堆栈可容纳的最大元素数量的单词, size 将是当前堆栈中元素的数量。
答案 1 :(得分:1)
是的,你需要两个构造函数。一个没有参数的构造函数,一个带有参数的构造函数:
public BoundedStack() {
// you could set the array directly
list = new Object[32];
// however, it's better to call the other constructor using the this() syntax
this(32);
}
public BoundedStack(int size) {
list = new Object[size];
}
您不需要跟踪与数组本身分开的数组大小。您只需使用list.length
查找数组的大小,换句话说:
public int getSize() {
return list.length;
}
附注:您无需说java.lang.Object
即可使用Object
。同样按照惯例,您不应该使用大写字母启动变量名称。
答案 2 :(得分:1)
我必须使用2个构造函数吗?一个与参数,一个没有?
你不必这样做,但这似乎是最自然的。例如:
...
public static final int DEFAULT_BOUND = 32;
private final Object[] elements;
private int size;
public BoundedStack() { this(DEFAULT_BOUND); }
public BoundedStack(int bound) {
// validate bound ...
elements = new Object[bound];
size = 0;
}
public int size() { return size; }
public int getBound() { return elements.length; }
令我感到困惑的另一件事(我认为)是有界堆栈至少有两个"尺寸":
一个"尺寸"是堆栈中当前的元素数。如果您要与Collection
框架保持一致,那么该大小应该被称为size
,并且应该由具有非标准名称size()
的getter返回。
第二个"尺寸"是有约束力的;即允许在堆栈中的最大元素数。我建议您将其称为bound
或upperBound
,并为其提供常规命名的getter。
还可能有第三个" size",表示当前已分配到有界堆栈的空间量。但是,这应该是内部的;即没有通过吸气剂暴露。
在收集框架中,术语"容量"用于初始"大小调整参数"。但是,具有"容量的集合类型"参数仅将其视为提示。你想要的是对堆栈大小的硬性限制,以及(IMO)保证使用不同的名称。
你应该在你的API和内部细节中谨慎区分这两个"尺寸" ......或者你会混淆使用API的人,最终是你自己。