熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

“類”常數分組

2022-06-13   來源: Java核心技術 

  由於置入一個接口的所有字段都自動具有static和final屬性所以接口是對常數值進行分組的一個好工具它具有與C或C++的enum非常相似的效果如下例所示
  
  //: Monthsjava
  // Using interfaces to create groups of constants
  package c;
  
  public interface Months {
   int
    JANUARY = FEBRUARY = MARCH =
    APRIL = MAY = JUNE = JULY =
    AUGUST = SEPTEMBER = OCTOBER =
    NOVEMBER = DECEMBER = ;
  } ///:~
  
  注意根據Java命名規則擁有固定標識符的static final基本數據類型(亦即編譯期常數)都全部采用大寫字母(用下劃線分隔單個標識符裡的多個單詞)
  
  接口中的字段會自動具備public屬性所以沒必要專門指定
  
  現在通過導入c*或cMonths我們可以從包的外部使用常數——就象對其他任何包進行的操作那樣此外也可以用類似MonthsJANUARY的表達式對值進行引用當然我們獲得的只是一個int所以不象C++的enum那樣擁有額外的類型安全性但與將數字強行編碼(硬編碼)到自己的程序中相比這種(常用的)技術無疑已經是一個巨大的進步我們通常把硬編碼數字的行為稱為魔術數字它產生的代碼是非常難以維護的
  
  如確實不想放棄額外的類型安全性可構建象下面這樣的一個類(注釋①)
  
  //: Monthjava
  // A more robust enumeration system
  package c;
  
  public final class Month {
   private String name;
   private Month(String nm) { name = nm; }
   public String toString() { return name; }
   public final static Month
    JAN = new Month(January)
    FEB = new Month(February)
    MAR = new Month(March)
    APR = new Month(April)
    MAY = new Month(May)
    JUN = new Month(June)
    JUL = new Month(July)
    AUG = new Month(August)
    SEP = new Month(September)
    OCT = new Month(October)
    NOV = new Month(November)
    DEC = new Month(December);
   public final static Month[] month = {
    JAN JAN FEB MAR APR MAY JUN
    JUL AUG SEP OCT NOV DEC
   };
   public static void main(String[] args) {
    Month m = MonthJAN;
    Systemoutprintln(m);
    m = Monthmonth[];
    Systemoutprintln(m);
    Systemoutprintln(m == MonthDEC);
    Systemoutprintln(mequals(MonthDEC));
   }
  } ///:~
  
  ①是Rich Hoffarth的一封Email觸發了我這樣編寫程序的靈感
  
  這個類叫作Month因為標准Java庫裡已經有一個Month它是一個final類並含有一個private構建器所以沒有人能從它繼承或制作它的一個實例唯一的實例就是那些final static對象它們是在類本身內部創建的包括JANFEBMAR等等這些對象也在month數組中使用後者讓我們能夠按數字挑選月份而不是按名字(注意數組中提供了一個多余的JAN使偏移量增加了也使December確實成為月)在main()中我們可注意到類型的安全性m是一個Month對象所以只能將其分配給Month在前面的Monthsjava例子中只提供了int值所以本來想用來代表一個月份的int變量可能實際獲得一個整數值那樣做可能不十分安全
  
  這兒介紹的方法也允許我們交換使用==或者equals()就象main()尾部展示的那樣
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26405.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.