Java 何时使用常数?
下面是ArrayList的代码片段,它接受用户提供的“initialCapacity”或默认值Java 何时使用常数?,java,constants,Java,Constants,下面是ArrayList的代码片段,它接受用户提供的“initialCapacity”或默认值10。我的问题是——为什么10不是一个静态常数?我猜当一个变量在代码中重复多次时,就会使用常量。我说得对吗 public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+
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);
}
public数组列表(int initialCapacity){
超级();
如果(初始容量<0)
抛出新的IllegalArgumentException(“非法容量:”+
初始容量);
this.elementData=新对象[初始容量];
}
/**
*构造一个初始容量为10的空列表。
*/
公共数组列表(){
这(10);
}
常量用于为变量命名
您可以称之为“DEFAULT\u INITIAL\u CAPACITY
”
一个好的程序,是一个你可以像读故事一样阅读的程序
下面是一个代码片段,例如:
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
,当有人来编辑我的代码时,他不会知道我为什么要在里面写34。
但这只是一长串可能的错误中错误的下一个索引。从Java7开始,有一个常量 在您发布的代码示例中,该值仅使用一次,并且注释描述了它的用途,因此使用常量没有意义。可以说,没有常数更好,因为阅读时你不必停下来四处寻找常数的定义。使用常量会在读者中产生一种期望,即该值会多次出现,硬编码这会清楚地表明该值不会出现在其他任何地方。出于这些原因,不使用常量可能是提高可读性的一种选择
一旦初始化逻辑更改为惰性,就必须在两个地方引用默认容量值(因为在添加新元素时必须对其进行检查)。引入常数是有意义的;如果类的维护者想要更改初始容量,那么他们只需在一个地方进行更改。常量是他们的,以使代码更具可读性。对于Java来说,是否将任何事物声明为常量并不重要。一旦代码被编译,每个常量都将被连接(不确定是否可以在这里使用该术语),如果它是一个可以在编译时计算的表达式,那么它将被连接 所以如果你写
int INITIAL_CAPACITY = 10;
public ArrayList() {
this(INITIAL_CAPACITY);
}
编译后将始终转换为
public ArrayList() {
this(10);
}
这一切都是为了节省运行时的时间。因此,最好单独声明常量,因为这样可以使它更易于理解,因为它向用户清楚地说明了它的用途。在您的情况下,初始_容量对于不熟悉代码的人来说更有意义,而在调用中仅使用“10”
您不必为这些优化而烦恼,因为JVM将为您完成这些优化。您应该尽量使其更具可读性。您是对的,当一个变量重复多次时,您应该使用常量。你应该使用声纳来检查这种最佳做法。在这种情况下,这主要是风格问题。它本可以作为一个静态常量,但作者可能觉得这不会增加可读性。
public ArrayList() {
this(10);
}