【问题标题】:When to use a constant?什么时候使用常量?
【发布时间】:2014-06-26 17:47:04
【问题描述】:

下面是 ArrayList 的代码 sn-p,它要么接受用户提供的“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);
}

【问题讨论】:

  • 在这种情况下,很大程度上是风格问题。它可以作为一个静态常量来完成,但作者可能认为这不会增加可读性。

标签: java constants


【解决方案1】:

常量用于给变量命名。

你可以叫它“DEFAULT_INITIAL_CAPACITY

一个好的程序,是一个你可以像故事一样阅读的程序。

这里是一个代码sn-p的例子:

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 编写的,但仍然证明了我的观点。

这里是“BAD_TYPE_FORMAT”的定义

#define BAD_TYPE_FORMAT 34

如果我把它留为34,当有人来编辑我的代码时,他不会知道我为什么在里面写了正好34。 但它只是错误的下一个索引,来自一长串可能的错误。

【讨论】:

    【解决方案2】:

    常量是为了让您的代码更具可读性。对于 Java,是否将任何事物声明为常量并不重要。编译代码后,将连接每个常量(不确定您是否可以在此处使用该术语),并且如果它是可以在编译时评估的表达式,则可以。

    所以如果你写

     
    
        int INITIAL_CAPACITY  = 10;
    
        public ArrayList() {
            this(INITIAL_CAPACITY);
        }
    
    

    编译后总会转成

     
    
        public ArrayList() {
            this(10);
        }
    
    

    这样做是为了在运行时节省时间。所以最好单独声明常量,因为它更易于阅读,因为它清楚地向用户说明了它的用途。在您的情况下,INITIAL_CAPACITY 对于不熟悉代码的人来说更有意义,而不是调用中使用的“10”。

    您不必担心这些优化,因为 JVM 会为您完成这些。您应该尝试使其更具可读性。

    【讨论】:

      【解决方案3】:

      从 Java 7 开始有一个常量。

      在您发布的代码示例中,该值仅使用一次,并且注释描述了它的用途,因此使用常量没有意义。可以说没有常数会更好,因为阅读时您不必停下来四处寻找常数定义。使用常量会在读者中产生一种期望,即这将出现多次,硬编码可以清楚地表明该值不会出现在其他任何地方。由于这些原因,可以选择不使用常量来提高可读性。

      一旦初始化逻辑更改为惰性,则必须在两个地方引用默认容量值(因为添加新元素时必须检查它)。引入一个常量是有意义的;如果类的维护者想要更改初始容量,那么他们只需在一个地方进行更改。

      【讨论】:

        【解决方案4】:

        你是对的,当一个变量重复多次时,你应该使用常量。您应该使用 Sonar 来检查这种最佳做法。

        【讨论】:

          猜你喜欢
          • 2010-09-12
          • 2021-04-15
          • 2010-10-11
          • 2021-10-08
          • 2016-10-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多