<blockquote> <p>java中類名稱、變量名稱等等都有標示符的規範:由字母、數字、下劃線、$組成,不能以數字開頭,不能是java中的保留字。</p> <p>關於保留字,java中有4個保留字。</p> <p>java產生時,預留了2個保留字:goto 、 const</p> <p>JDK1.4中新增了assert保留字</p> <p>JDK1.5中新增了enum保留字</p> </blockquote> <blockquote></blockquote> <p>   </p> <p>        小注:</p> <blockquote> <p>assert:斷言</p> <p>enum  : 枚舉</p> </blockquote> <blockquote></blockquote> <blockquote> <p><font color="#ff0000" size="5"><strong>斷言</strong></font></p> <p><strong>Java陷阱之assert關鍵字</strong></p> <p><strong>1、概述</strong></p> <p><strong></strong></p> <p>在C和C++語言中都有assert關鍵,表示斷言。</p> <p>在Java中,一樣也有assert關鍵字,表示斷言,用法和含義都差很少。</p> <p><strong>2、語法</strong></p> <p><strong></strong></p> <p>在Java中,assert關鍵字是從JAVA SE 1.4 引入的,<font color="#ff0000">爲了不和老版本的Java代碼中使用了assert關鍵字致使錯誤,Java在執行的時候默認是不啓動斷言檢查的(這個時候,全部的斷言語句都將忽略!),若是要開啓斷言檢查,則須要用開關-enableassertions或-ea來開啓。</font></p> <p>assert關鍵字語法很簡單,有兩種用法:</p> <p>一、assert <boolean表達式></p> <p>若是<boolean表達式>爲true,則程序繼續執行。</p> <p>若是爲false,則程序拋出AssertionError,並終止執行。</p> <p>二、assert <boolean表達式> : <錯誤信息表達式></p> <p>若是<boolean表達式>爲true,則程序繼續執行。</p> <p>若是爲false,則程序拋出java.lang.AssertionError,並輸入<錯誤信息表達式>。</p> <p><font color="#ff0000">assert expression1; <br />assert expression1:expression2; <br />若是expression1爲true,則不拋出錯誤,程序正常運行,expression2也不會執行。 <br />若是expression1爲false,則拋出異常,程序中斷跳出,expression2執行。</font></p> <p><strong>3、應用實例</strong></p> <p>下面給出一個例子,經過例子說明其用法:</p> <p><b>public</b> <b>class</b> AssertFoo {</p> <p><b>public</b> <b>static</b> <b>void</b> main(String args[]) {</p> <p>//斷言1結果爲true,則繼續往下執行</p> <p><b>assert</b> <b>true</b>;</p> <p>System.<i>out</i>.println("斷言1沒有問題,Go!");</p> <p>System.<i>out</i>.println("\n-----------------\n");</p> <p>//斷言2結果爲false,程序終止</p> <p><b>assert</b> <b>false</b> : "斷言失敗,此表達式的信息將會在拋出異常的時候輸出!";</p> <p>System.<i>out</i>.println("斷言2沒有問題,Go!");</p> <p>}</p> <p>}</p> <p>保存代碼到C:\AssertFoo.java,而後按照下面的方式執行,查看控制檯輸出結果:</p> <p><strong>一、編譯程序:</strong></p> <p>C:\>javac AssertFoo.java</p> <p><strong>二、默認執行程序,沒有開啓-ea開關:</strong></p> <p>C:\>java AssertFoo</p> <p>斷言1沒有問題,Go!</p> <p>-----------------</p> <p>斷言2沒有問題,Go!</p> <p><strong>3<font color="#ff0000">、開啓-ea開關,執行程序:</font></strong></p> <p>C:\>java -ea AssertFoo</p> <p>斷言1沒有問題,Go!</p> <p>-----------------</p> <p>Exception in thread "main" java.lang.AssertionError: 斷言失敗,此表達式的信息將</p> <p>會在拋出異常的時候輸出!</p> <p>        at AssertFoo.main(AssertFoo.java:10)</p> <p><strong>4、陷阱</strong></p> <p>assert關鍵字用法簡單,可是使用assert每每會讓你陷入愈來愈深的陷阱中。應避免使用。筆者通過研究,總結了如下緣由:</p> <p>一、<font color="#ff0000">assert關鍵字須要在運行時候顯式開啓才能生效,不然你的斷言就沒有任何意義</font>。而如今主流的Java IDE工具默認都沒有開啓-ea斷言檢查功能。這就意味着你若是使用IDE工具編碼,調試運行時候會有必定的麻煩。而且,對於Java Web應用,程序代碼都是部署在容器裏面,你無法直接去控制程序的運行,若是必定要開啓-ea的開關,則須要更改Web容器的運行配置參數。這對程序的移植和部署都帶來很大的不便。</p> <p>二、用assert代替if是陷阱之二。assert的判斷和if語句差很少,但二者的做用有着本質的區別:assert關鍵字本意上是爲測試調試程序時使用的,但若是不當心用assert來控制了程序的業務流程,那在測試調試結束後去掉assert關鍵字就意味着修改了程序的正常的邏輯。</p> <p>三、assert斷言失敗將面臨程序的退出。這在一個生產環境下的應用是毫不能容忍的。通常都是經過異常處理來解決程序中潛在的錯誤。可是使用斷言就很危險,一旦失敗系統就掛了。</p> <p><strong>5、對assert的思考</strong></p> <p>assert既然是爲了調試測試程序用,不在正式生產環境下用,那應該考慮更好的測試JUint來代替其作用,JUint相對assert關鍵的所提供的功能是有過之而無不及。固然徹底能夠經過IDE debug來進行調試測試。在此看來,assert的前途一片昏暗。</p> <p>所以,應當避免在Java中使用assert關鍵字,除非哪一天Java默認支持開啓-ea的開關,這時候能夠考慮。對比一下,assert能給你帶來多少好處,多少麻煩,這是咱們選擇是否使用的的原則。</p> <p><strong><font color="#ff0000" size="5">枚舉</font></strong></p> <p><strong>Java Enum </strong><strong>學習</strong><strong></strong></p> <p><strong>1. </strong><strong>關於 </strong><strong>Java Enum:</strong></p> <p>學過 C/C++ 等語言的人,應該都對 Enum 類型略知一二。 Enum 通常用來表示一組相同類型的常量。如性別、日期、月份、顏色等。對這些屬性用常量的好處是顯而易見的,不只能夠保證單例,且比較時候能夠用 」==」 來替換 equals 。是一種好的習慣。 JDK1.5 以前沒有 Enum 這個類型,那時候通常用接口常量來替代。有了 JavaEnum 以後,能夠更貼近的表示這種常量。</p> <p><strong>2. </strong><strong>如何使用 </strong><strong>Java Enum</strong></p> <p>簡單的用法: JavaEnum 簡單的用法通常用於表明一組經常使用常量,可用來表明一類相同類型的常量值。如:</p> <p>性別:</p> <p><strong>public </strong><strong>enum </strong>SexEnum {</p> <p><em>male </em>, <em>female </em>;</p> <p>}</p> <p>顏色:</p> <p><strong>public </strong><strong>enum </strong>Color {</p> <p><em>RED </em>, <em>BLUE,GREEN,BLACK </em>;</p> <p>}</p> <p>枚舉對象裏面的值都必須是惟一的。</p> <p>能夠經過 Enum 類型名直接引用該常量,如 SexEnum.male,Color.RED.</p> <p>複雜用法: Java 爲枚舉類型提供了一些內置的方法,同事枚舉常量還能夠有本身的方法。能夠很方便的遍歷枚舉對象,看個下面的例子:</p> <p>1. <strong>代碼一 WeekDay.java </strong>:</p> <p><strong></strong></p> <p>/** <br />* @author yubing.linyb <br />* 2009.7.29 <br />* 定義一個枚舉類型,表明星期一到星期日的7個縮寫常量 <br />* 同時還定義了枚舉類型的屬性day,該屬性能夠是final,也但是變量 <br />* 同時還定義了該枚舉類型的一個方法printDay <br />*/ <br />public enum WeekDay { <br />Mon("Monday"), Tue("Tuesday"), Wed("Wednesday"), Thu("Thursday"), Fri( <br />        "Friday"), Sat("Saturday"), Sun("Sunday");</p> <p>/**定義枚舉類型本身的屬性**/ <br />private final String day; <br />  <br />private WeekDay(String day) { <br />     this.day = day; <br />}</p> <p>/**定義枚舉類型本身的方法**/ <br />public static void printDay(int i){ <br />     switch(i){ <br />     case 1: System.out.println(WeekDay.Mon); break; <br />     case 2: System.out.println(WeekDay.Tue);break; <br />     case 3: System.out.println(WeekDay.Wed);break; <br />     case 4: System.out.println(WeekDay.Thu);break; <br />     case 5: System.out.println(WeekDay.Fri);break; <br />     case 6: System.out.println(WeekDay.Sat);break; <br />     case 7: System.out.println(WeekDay.Sun);break; <br />     default:System.out.println("wrong number!"); <br />     } <br />} <br />  <br />public String getDay() { <br />     return day; <br />} <br />}</p> <p><strong>2. </strong><strong>代碼二 WeekDayTest.java:</strong></p> <p>/** <br />* @author yubing.linyb <br />* 2009.7.29 <br />* 測試枚舉類型WeekDay. <br />*/ <br />public class WeekDayTest { <br />  public static void main(String args[]) { <br />      for (WeekDay day : WeekDay.values()) { <br />         System.out.println(day + "====>" + day.getDay()); <br />      } <br />      WeekDay.printDay(5); <br />  } <br />}</p> <p><strong>輸出結果爲:</strong></p> <p><strong></strong>Mon====>Monday</p> <p>Tue====>Tuesday</p> <p>Wed====>Wednesday</p> <p>Thu====>Thursday</p> <p>Fri====>Friday</p> <p>Sat====>Saturday</p> <p>Sun====>Sunday</p> <p>Fri<strong></strong></p> <p><strong>3. </strong><strong>Java Enum </strong><strong>原理</strong><strong></strong></p> <p>Java Enum 類型的語法結構儘管和 java 類的語法不同,應該說差異比較大。可是通過編譯器編譯以後產生的是一個class 文件。該 class 文件通過反編譯能夠看到其實是生成了一個類,該類繼承了 java.lang.Enum<E>.</p> <p>WeekDay (javap WeekDay 命令 以後獲得的內容以下 ( 去掉了彙編代碼 ) :</p> <p>public final class WeekDay extends java.lang.Enum{ <br />    public static final WeekDay Mon; <br />    public static final WeekDay Tue; <br />    public static final WeekDay Wed; <br />    public static final WeekDay Thu; <br />    public static final WeekDay Fri; <br />    public static final WeekDay Sat; <br />    public static final WeekDay Sun; <br />    static {}; <br />    public static void printDay(int); <br />    public java.lang.String getDay(); <br />    public static WeekDay[] values(); <br />    public static WeekDay valueOf(java.lang.String); <br />}</p> <p><strong>因此實際上 Enum 類型就是以 Java 類來實現的,沒有什麼新的特色,只不過 java 編譯器幫咱們作了語法的解析和編譯。徹底也能夠本身實現。可是既然有這樣方便一個東西,固然會去用了。</strong></p></blockquote>java