目录
5.6枚举类
5.7 反射
5.7.1 Class类
4.7.2 声明异常入门
5.7.3 资源
5.7.4 利用反射分析类的能力
5.7.5 使用反射在运行时分析对象
5.7.6 使用反射编写泛型数组代码
5.7.7 调用任意方法和构造器
5.8 继承的设计技巧
5.6枚举类
public enum Size{SMALL,MEDIUM,LARGE,EXTRA_LARGE};
这个声明定义的类型是一个类,刚好有四个实例,不能构造新的对象,因此在比较两个枚举类型的值时,并不需要调用equals,直接使用“==”就可以了
如果需要的话,可以为枚举类型增加构造器、方法和字段:
枚举的构造器总是私有的,可以省略private修饰符。如果声明一个enume构造器为public或protected,会出现语法错误。
所有的枚举类型都是Enum类的子类。它们继承了这个类的许多方法,其中最有用的是toString,这个方法会返回枚举常量名。如:Size.SMALL.toString(),将返回字符串“SMALL”
toString的逆方法是静态方法valueOf,如:
Size s = Enum.valueOf(Size.class,"SMALL");//将s设置成Size.SMALL
每个枚举类型都有一个静态的values方法,它将返回一个包含全部枚举值的数组,如:
Size[] values = Size.values();//返回包含元素Size.SMALL,Size.MEDIUM......的数组
ordinal方法返回enum声明中枚举常量的位置,从0开始计数。如:
Size.MEDIUM.ordinal();返回1
5.7 反射
反射库(reflection library)提供了一个丰富且精巧的工具集,可以用来编写能够动态操作Java代码的程序。使用反射,Java可以支持用户界面生成器、对象关系映射器以及很多其他需要动态查询类能力的开发工具。
能够分析类能力的程序称为反射(reflective)。反射机制可以用来:
1.在运行时分析类的能力
2.在运行时检查对象,如编写一个适用于所有类的toString方法
3.实现泛型数组操作代码
4.利用Method对象,这个对象很像C++中的函数指针
5.7.1 Class类
4.7.2 声明异常入门
5.7.3 资源
类通常有一些关联的数据文件,如图像和声音文件,包含消息字符串和按钮标签的文本文件
在Java中,这些关联的文件被称为资源(resource)
5.7.4 利用反射分析类的能力
检查类的结构是反射机制最重要的内容。
在java.lang.reflect包中有三个类Field,Method和Constructor分别用于描述类的字段、方法和构造器。这三个类都有一个getName的方法,用来返回字段、方法或构造器的名称。
Filed类有一个getType方法,用来返回描述字段类型的一个对象,这个对象的类型同样是Class。
Method和Constructor类有报告参数的方法,Method类还有一个报告返回类型的方法。这三个类都有一个名为getModifiers的方法,它将返回一个整数,用不同的0/1位描述所使用的修饰符,如public和static。可以利用java.lang.reflect包中的Modifier类的静态方法分析getModifiers返回的这个整数。如使用isPublic,isPrivate或isFinal判断方法或构造器是哪种修饰符。在getModifiers返回的整数上调用Modifier类中的适当方法,也可以利用Modifier.toString方法将修饰符打印出来。
Class类中的getFields,getMethods和getConstructors方法将分别返回这个类支持的公共字段、方法和构造器的数组,其中包括超类的公共成员。Class类的getDeclareFields,getDeclareMethods和getDeclareConstructors将分别返回类中声明的全部字段、方法和构造器的数组,其中包括私有成员、包成员和受保护成员,但不包括超类成员。
5.7.5 使用反射在运行时分析对象
5.7.6 使用反射编写泛型数组代码
5.7.7 调用任意方法和构造器
5.8 继承的设计技巧
1.将公共操作和字段放在超类中。
2.不要使用受保护的字段。
3.使用继承实现“is-a”关系。
4.除非所有继承的方法都有意义,否则不要使用继承。
5.在覆盖方法时,不要改变任何预期的行为。
6.使用多态,而不要使用类型信息。
7.不要滥用反射。