下面是ArrayList的代码片段,它接受用户提供的'initialCapacity'或默认值10
。我的问题 - 为什么10不是静态常数?我想在代码中重复多次变量时会使用常量。我对吗 ?
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this(10);
}
答案 0 :(得分:6)
常量用于为变量命名。
您可以将其称为&#34; DEFAULT_INITIAL_CAPACITY
&#34;
一个好的程序,是一个你可以像故事一样阅读的程序。
以下是代码段:
char * find_type(char *str,int *type){
str = trim_leading_space(str);
if(*str == SLASH_SIGN){
str++;
}else{
display_error(BAD_TYPE_FORMAT, str);
}
str = trim_leading_space(str);
*type = convert_to_zero_or_one(str[0]);
if(*type == NO){
display_error(BAD_TYPE_FORMAT, str);
}else {
str++;
}
return str;
}
代码是用C语言编写的,但仍然证明了我的观点。
这是&#34; BAD_TYPE_FORMAT
&#34;
#define BAD_TYPE_FORMAT 34
如果我把它留给34
,当有人来编辑我的代码时,他不会知道为什么我写了34个。
但它只是错误的下一个索引,来自一长串可能的错误。
答案 1 :(得分:2)
从Java 7开始,这是一个常量。
在代码示例中,您发布的值仅使用一次,而注释描述了它的用途,因此使用常量没有意义。可以说没有常数会更好,因为在阅读时你不必停下来四处寻找恒定的定义。使用常量会在读者中产生一种期望,这种情况会多次出现,硬编码使得这一值很明显,这个值不会出现在其他任何地方。由于这些原因,不使用常量可能是为提高可读性而做出的选择。
初始化逻辑变为惰性后,必须在两个位置引用默认容量值(因为在添加新元素时必须进行检查)。引入一种恒定的意义;如果班级的维护者想要改变初始容量,那么他们只需要在一个地方进行改变。
答案 2 :(得分:2)
常量是使代码更具可读性的因素。对于Java来说,无论是否将任何事物声明为常量都无关紧要。一旦代码被编译,每个常量将被连接(不确定你是否可以在这里使用该术语),如果它是一个可以在编译时计算的表达式,它将是。
所以,如果你写
int INITIAL_CAPACITY = 10;
public ArrayList() {
this(INITIAL_CAPACITY);
}
编译后将始终转换为
public ArrayList() {
this(10);
}
这样做是为了节省运行时的时间。因此,最好单独声明常量,因为它使人们更容易阅读,因为它清楚地向用户说明了它的用途。在您的情况下,INITIAL_CAPACITY对不熟悉代码的人更有意义,然后在调用中使用“10”。
您不必为这些优化而烦恼,因为JVM会为您做到这一点。你应该尝试提高可读性。
答案 3 :(得分:0)
你说得对,你应该在变量重复多次时使用常量。您应该使用Sonar来检查这种最佳实践。