<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