什么时候使用常数?

时间:2014-06-26 17:47:05

标签: java constants

下面是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);
}

4 个答案:

答案 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来检查这种最佳实践。