在一個軟件系統中會使用一些常量,一種流行的做法是把相關的常量放在一個專門的常量接口中定義,例如:
package com.FinalInterface; public interface MyConstants { public static final double MATH_PI = 3.1415926; public static final double MATH_E = 2.71828; }
以下Circle類需要訪問以上MATH_PI常量,一種方式是采用"My-Constants.MATH_PI"的形式,如下:
package com.FinalInterface; public class Circle { private double r;//半徑 public Circle(double r){ this.r = r; } public double getCircumference(){ return 2 * r * MyConstants.MATH_PI; } }
還有一種方式是讓Circle類中實現MyConstants接口,如下:
inport mypack.myConstants; public class Circle inplenments MyConstants{ private double r; public Circle (double r){this.rar;} public double getCircumference () {return *2 * r * MATH_PI;} public double getArea(){return r*r * MATH_PI;} }
第二種方式使得Circle類繼承了MyConstants接口的常量,可以在程序中直接引用常量名,但這種方式違背了面向對象的封裝思想,MATH_PI常量是Circle類的實現細節的一部分,僅僅在計算圓周長和圓面積是才會用到,沒有必要向外界公開MATH_PI常量.這其實是一種向外界泄露實現的行為,會絮兒系統的可維護性. 在JDK1.5中因為了 import static 語句,它允許類直接訪問另一個接口B或類B中的靜態常量,而不必指定接口B或類B的名字,而且類A無須實現接口B或者繼承類B。如下:
package com.FinalInterface; import static com.FinalInterface.MyConstants.*; public class Circle { private double r;//半徑 public Circle(double r){ this.r = r; } public double getCircumference(){ return 2 * r * MATH_PI; } }
import static 語句既可以簡化編程,又能防止Circle類繼承並公開MyConstants中的靜態常量。