一.分析 一般来说,我们经常使用的枚举项只有一个属性,即排序号,其默认值是从0.1.2... ....但是除了排序号外,枚举还有一个(或多个)属性:枚举描述,它的含义是通过枚举的构造函数,声明每个枚举项(也就是枚举实例)必须具有的属性和行为,这是对枚举项的描述或补充,目的是使枚举项表述的意义更加清晰准确. 二.场景 比如,可以通过枚举构造函数声明业务值,定义可选项,添加属性,看如下代码: public class Client { public static void main(String[]…
一.分析 一般来说,我们经常使用的枚举项只有一个属性,即排序号,其默认值是从0.1.2... ....但是除了排序号外,枚举还有一个(或多个)属性. 二.场景 比如,可以通过枚举构造函数声明业务值,定义可选项,添加属性,看如下代码: enum Role{ Admin("管理员",new Lifetime(),new Scope()); User("普通用户",new Lifetime(),new Scope()); //中文描述 private String nam…
一.分析 每个枚举都是java.lang.Enum的子类,都可以访问Enum类提供的方法,比如hashCode.name.valueOf等,其中valueOf方法会把一个String类型的名称转变成枚举项,也就是在枚举项中查找字面值和该参数相等的枚举项. 我们来深入分析一下该valueOf方法的源代码: public static <T extends Enum<T>> T valueof(Class<T> enumType,String name){ //通过反射,从…
一.分析  从Java 5开始引入静态导入语法(import static),其目的是为了减少字符输入量,提高代码的可阅读性,以便更好地理解程序. 但是,滥用静态导入会使程序更难阅读,更难维护.静态导入后,代码中就不用再写类名了,但是我们知道类是“一类事物的描述”,缺少了类名的修饰,静态属性和静态方法的表象意义就会被无限方法,这会让阅读者很难弄清楚其属性或方法代表何以,甚至是哪一个类的属性(方法)都要思考一番(当然,IDE友好提示功能另说),特别是在一个类中有多个静态导入语句时,若还是用*(星号…
一.分析  字符串的操作,诸如追加.合并.替换.倒序.分隔等,都是在编码过程中经常用到的,而且Java也提供了append.replace.reverse.split等方法来完成这些操作,它们使用起来确实方便,但是更多的时候,需要使用正则表达式来完成复杂的处理. 二.场景  统计一篇文章中的单词的数量,代码如下: public static void main(String[] args){ //接受键盘输入 Scanner input = new Scanner(System.in); whi…
一.分析  Java中的数组是定长的,一旦经过初始化声明就不可改变长度,这在实际使用中非常不方便. 二.场景  比如要对班级学生的信息进行统计,因为我们不知道一个班级会有多少学生(随时都有可能会有学生入学.退学或转学),所以需要一个足够大的数组来容纳所有的学生. 但是多大才算足够大呢?随着环境的变化,“足够大”也可能会编程“足够小”,然后就会超出数组的最大容量的情况,那该如何解决呢? 事实上,可以通过对数组扩容“婉转”地解决问题,代码如下: public static <T> T[] expa…
一.分析  使用枚举定义常量时,会有伴有大量的switch语句判断,目的是为每个枚举解释其行为. 我们知道,目前的Java的switch语句只能判断byte.short.char.int类型(JDK7已经允许使用string类型),为什么枚举也能跟在switch后面呢?很简单,因为编译的时候,编译器判断出switch后面的参数是枚举类型,然后就会根据枚举的排序值继续匹配.如下: public static void doSports(Season season){ switch(season.o…
一.分析  在Java运算中的类型转换,是先运算在进行类型转换的.具体场景如下. 二.场景  在如下程序中: public class Client{ public static final int LIGHT_SPEED = 30 * 10000 * 1000; public static void main(String[] args){ System.out.println("月亮照射到地球需要1秒,计算月亮到地球的距离."); long dis1 = LIGHT_SPEED *…
一.分析  基本类型可以比较大小,其所对应的包装类型都实现了Comparable接口此问题. 二.场景  代码如下: public class Client{ public static void main(String[] args){ Integer i = new Integer(100); Integer j = new Integer(100); compare(i,j); } } public static void compare(Integer I, Integer j){ Sy…
一.分析  对于一个字符串进行拼接有三种方法:加号.concat方法.及StringBuiler或StringBuffer. 1."+"方法拼接字符串  str += "c";等效于:str = new StringBuffer(str).append("c").toString(); 虽然编译器对字符串加号做了优化,它会用StringBuffer的append方法进行追加.再是通过toString方法转换成String字符串的. 它与纯粹的ap…