Java开发之道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

陷阱9 顺理成章——静态常量的初始化顺序有讲究

静态常量是程序中经常使用的元素,如果在程序中存在多个静态常量,并且是通过调用方法实现初始化常量的操作的,则一定要注意这些静态常量的排列顺序,如果顺序不正确,程序很有可能就会出现错误的结果,所以在使用多个静态常量,特别是通过调用方法实现初始化时,一定要特别小心。

接下来通过两个示例来说明,为什么在使用多个静态成员变量时,必须要注意它们的排列顺序。

(1)错误结果

    import java. util. Calendar;
    public class Employee {
        ❶public static final Employee employee= new Employee (); // 创建常量,该常量是类的实例
        ❷public static final int CURRENT_YEAR = currentYear (); // 定义表示当前年的常量
        private int workAges;                           // 定义表示员工工龄的成员变量
        /**
        * 类的构造方法,用于为初始化成员变量workAges
        */
        ❸private Employee (){
        ❹workAges = CURRENT_YEAR - 2005;               // 计算员工的工龄
        }
        /**
        * 获得员工工龄的方法
        */
       public int getWorkAges (){
       return workAges;
       }
       /**
        * 获得当前年的方法
        */
        ❺public static int currentYear (){
       return Calendar. getInstance (). get (Calendar. YEAR); // 通过Claendar类获得当前年
       }
       public static void main (String[] args) {
       // 输出员工的工龄
       System. out. println ("您的工龄是:"+employee. getWorkAges ());
       }
    }

说明

运行本示例,程序将输出“您的工龄是:-2005”这样的信息,显然这是错误的结果,原因就在于❶、❷标记处的两行代码顺序不正确,所以导致了结果错误。

注意

本示例是这样一个执行过程,程序首先执行❶标记处的代码创建Employee类的实例,在创建实例时,执行❸标记处构造方法里的代码,即执行❹标记处的代码,但是此时❷标记处的代码中使用的CURRENT_YEAR常量还没有被赋值,而是使用int型的初始值0,所以❹标记处的代码计算出的成员变量workAges的值是-2005,然后才会执行❷标记处的代码调用❺标记处的currentYear方法为CURRENT_YEAR常量赋值为当前年2010,但是此时已经太迟了,因为员工工龄已经计算出来是-2005。

(2)正确结果

将上一个示例中❶、❷标记处的两行代码位置互换,这样程序就可以输出正确的员工工龄了,下面用黑体标识的两行就是互换后的代码。

    import java. util. Calendar;
    public class Employee {
      public static final int CURRENT_YEAR = currentYear (); // 定义表示当前年的常量
      public static final Employee employee= new Employee (); // 创建常量,该常量是类的实例
      private int workAges;                                     // 定义表示员工工龄的成员变量
      /**
        * 类的构造方法,用于为初始化成员变量workAges
        */
      private Employee (){
      workAges = CURRENT_YEAR - 2005;                           // 计算员工的工龄
      }
      /**
        * 获得员工工龄的方法
        */
      public int getWorkAges (){
      return workAges;
      }
      /**
        * 获得当前年的方法
        */
      public static int currentYear (){
      return Calendar. getInstance (). get (Calendar. YEAR);         // 通过Claendar类获得当前年
      }
      public static void main (String[] args) {
      // 输出员工的工龄
      System. out. println ("您的工龄是:"+employee. getWorkAges ());
      }
    }

说明

运行本示例,程序将输出“您的工龄是:5”这样的信息,显然这是正确的结果,也就是员工的真实工龄,通过本示例也足以说明静态常量的初始化顺序对程序的执行结果是有影响的,因此在使用静态常量并需要对其进行初始化时,一定要注意语句的放置顺序,否则程序就会出错。