Java面向对象设计 – Java枚举类 枚举类型的超类 编译枚举类型时,编译器会创建一个类。 枚举类型可以具有构造函数,字段和方法。枚举类型仅在编译器生成的代码中实例化。 每个枚举类型都隐式地扩展java.lang.Enum类。 Enum类中定义的所有方法都可以与所有枚举类型一起使用。 枚举类 下表列出了在Enum类中定义的方法。 public final String name()返回枚举常量的名称。 public final int ordinal()返回枚举常量的顺序。 public final boolean equals(Object other)如果指定的对象等于枚举常量,则返回true。否则,它返回false。 ==运算符和equals()方法返回相同的结果,当它们用于两个枚举常量。 public final int hashCode()返回枚举常量的哈希码值。 public final int compareTo(E o)将此枚举常量与指定的枚举常量进行比较。它返回此枚举常量和指定的枚举常量的序数值的差异。 public final Class getDeclaringClass()返回声明枚举常量的类的类对象。 public String toString()默认情况下,它返回枚举常量的名称,这与name()方法相同。 public static valueOf(Class enumType,String name)返回指定的枚举类型和名称的枚举常量。 例子 Level lowLevel = Enum.valueOf(Level.class, "LOW") 以下代码显示了如何比较两个枚举常量: enum Level { LOW, MEDIUM, HIGH, URGENT; } public class Main { public static void main(String[] args) { Level s1 = Level.LOW; Level s2 = Level.HIGH; // s1.compareTo(s2) returns s1.ordinal() - s2.ordinal() int diff = s1.compareTo(s2); if (diff > 0) { System.out.println(s1 + " occurs after " + s2); } else { System.out.println(s1 + " occurs before " + s2); } } } 上面的代码生成以下结果。
Java面向对象设计 – Java注释反射 程序元素上的注释是Java对象。 允许您访问其注释的程序元素实现java.lang.reflect.AnnotatedElement接口。 以下类实现了AnnotatedElement接口: AnnotatedElement接口的方法用于访问以下列出的对象类型的注释。 java.lang.Class java.lang.reflect.Executable java.lang.reflect.Constructor java.lang.reflect.Field java.lang.reflect.Method java.lang.reflect.Parameter java.lang.Package java.lang.reflect.AccessibleObject 注释类型必须使用运行时的保留策略通过保留元注释注释,以便在运行时访问它。 例子 假设你有一个Test类,并且你想打印它的所有注释。以下代码片段将打印Test类的类声明上的所有注释: import java.lang.annotation.Annotation; @SuppressWarnings("unchecked") @Deprecated public class Main { public static void main(String[] argv) { // Get the class object reference Class<Main> c = Main.class; // Get all annotations on the class declaration Annotation[] allAnns = c.getAnnotations(); System.out.println("Annotation count: " + allAnns.length); // Print all annotations for (Annotation ann : allAnns) { System.out.println(ann); } } } Annotation接口的toString()方法返回注释的字符串表示形式。 例2 以下代码显示了如何获取特定注释。 import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @Documented @interface Version { int major(); int minor(); } @Version(major=1,minor=2) public class Main { public static void main(String[] argv) { Class<Main> c = Main.class; Version v = c.getAnnotation(Version.class); if (v == null) { System.out.println("Version annotation is not...
Java面向对象设计 – Java注释默认值 我们可以为注释中的元素定义默认值。我们不需要为带有默认值的注释元素提供值。 默认值可以使用以下一般语法定义: <modifiers> @interface <annotation type name> { <data-type> <element-name>() default <default-value>; } 关键字 default 指定默认值。 默认值必须是与元素的数据类型兼容的类型。 以下代码通过将其minor元素的默认值指定为零来创建Version注释类型,如下所示: public @interface Version { int major(); int minor() default 0; // zero as default value for minor } 例子 以下代码显示如何使用默认值使用注释。 @Version(major=1) // minor is zero, which is its default value @Version(major=2, minor=1) // minor is 1, which is the specified value 以下代码显示如何为数组和其他数据类型指定默认值: public @interface Version { double d() default 1.89; int num() default 1; int[] x() default { 1, 2 }; String s() default "Hello"; String[] s2() default { "abc", "xyz" }; Class c() default Exception.class; Class[] c2() default { Exception.class, java.io.IOException.class }; }
Java面向对象设计 – Java对注释类型的限制 注释类型的限制 注释类型不能从另一个注释类型继承。 每个注释类型都隐式地继承java.lang.annotation.Annotation接口,其声明如下: package java.lang.annotation; public interface Annotation { boolean equals(Object obj); int hashCode(); String toString(); Class<? extends Annotation> annotationType(); } 注释类型中的方法声明不能指定任何参数。 注释类型中的方法声明不能有throws子句。 在注释类型中声明的方法的返回类型必须是以下类型之一: 任何原始类型:byte,short,int,long,float,double,boolean和char java.lang.String java.lang.Class 枚举类型 注释类型 上述任何类型的数组,例如String[],int[]等。 返回类型不能是嵌套数组。例如,您不能具有String[][]或int[][]的返回类型。 您可以如下所示声明注释方法: public @interface MyAnnotation { Class element1(); // Any Class type Class<Test> element2(); // Only Test class type Class<? extends Test> element3(); // Test or its subclass type } 注释类型不能是泛型的。