Java

Java 知识量:11 - 45 - 220

4.3 枚举和注解><

枚举- 4.3.1 -

枚举(enum)是一种特殊的数据类型,用于定义有限个特定的值。它们是预定义的,不能创建新的枚举值,除非在定义枚举时明确地指定了这些值。

以下是一个枚举的基本例子:

public enum Day {  
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,   
    THURSDAY, FRIDAY, SATURDAY   
}

在这个例子中,Day是一个枚举类型,SUNDAY、MONDAY等是Day类型的七个预定义值。

枚举在Java中有很多用途。例如,它们可以用于switch语句,以替代一系列的if-else语句。它们也可以用于定义一组有限的值,比如一周的七天或者一年的十二个月。

每个枚举常量都是公开的、静态的、最终的字段,并且每个都是枚举类型的实例。枚举类型还有一些其他的特性,比如它们可以有构造器、方法和字段。这使得枚举可以比一组整型或字符串常量提供更多的功能。

例如,以下是一个更复杂的枚举例子,它包含一个构造器、一个方法和一个字段:

public enum Planet {  
    MERCURY(3.303e+23, 2.4397e6),  
    VENUS(4.869e+24, 6.0518e6),  
    EARTH(5.976e+24, 6.37814e6),  
    MARS(6.421e+23, 3.3972e6);  
  
    private final double mass;   // in kilograms  
    private final double radius; // in meters  
  
    // universal gravitational constant  (m3 kg-1 s-2)  
    public static final double G = 6.67300E-11;  
  
    // constructor  
    Planet(double mass, double radius) {  
        this.mass = mass;  
        this.radius = radius;  
    }  
  
    public double getMass() {  
        return mass;  
    }  
  
    public double getRadius() {  
        return radius;  
    }  
  
    // universal gravitational constant  (m3 kg-1 s-2)  
    public double surfaceGravity() {  
        return G * mass / (radius * radius);  
    }  
}

在这个例子中,Planet是一个枚举类型,MERCURY、VENUS、EARTH和MARS是四个预定义的Planet值。每个Planet都有一个mass和radius字段,以及一个用于计算表面重力的方法。

注解- 4.3.2 -

Java 注解(Annotation)是一种用于提供元数据的机制,它可以在编译时或运行时被访问。Java 注解是从 Java 5 开始引入的,它可以用于类、方法、变量、参数和包等元素上。

Java 注解的基本语法如下:

@annotation_name(attribute1 = value1, attribute2 = value2, ...)

其中,annotation_name 是注解的名称,attribute1、attribute2 等是注解的属性,value1、value2 等是属性值。

Java 注解有多种类型,包括:

  • 标记注解(Marker Annotation):没有属性的注解,用于标记某个元素。

  • 单值注解(Single-Value Annotation):只有一个属性的注解,用于为某个元素提供一个值。

  • 完整注解(Complete Annotation):有多个属性的注解,用于为某个元素提供多个值。

Java 注解的作用域可以是:

  • 源代码级别(SOURCE):注解只在源代码中存在,编译时会被丢弃。

  • 类级别(CLASS):注解在编译时存在,运行时会被丢弃。

  • 运行时级别(RUNTIME):注解在运行时存在,可以通过反射获取。

Java 中内置了一些注解,如 @Override、@Deprecated 等,也支持自定义注解。自定义注解需要使用 @interface 关键字定义,并可以添加属性。

自定义注解- 4.3.3 -

Java支持自定义注解。下面是一个简单的自定义注解的例子:

import java.lang.annotation.*;  
  
// 定义一个运行时可见的注解  
@Retention(RetentionPolicy.RUNTIME)  
// 定义一个注解,可以应用于类、方法、变量等  
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})  
public @interface MyAnnotation {  
    // 定义一个名为"value"的属性,其值为String类型  
    String value();  
}

在这个例子中,定义了一个名为MyAnnotation的注解,它有一个属性value,类型为String。这个注解可以应用于类、方法和变量上。

接下来,可以使用这个注解:

@MyAnnotation("这是一个自定义注解的示例")  
public class MyClass {  
    // ...  
}

在这个例子中,在MyClass类上应用了MyAnnotation注解,并为其value属性赋值为"这是一个自定义注解的示例"。

注意:Java的注解不会自己有任何行为。它们只是元数据,可以被其他工具或代码读取和处理。例如,写一些代码来处理这个注解,或者使用一些工具来查看注解的信息。

类型注解- 4.3.4 -

要使用类型注解,首先需要定义一个注解。以下是一个示例,定义了一个名为@NonNull的注解,它可以用于表示一个类型应该是非空的:

import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  
  
@Target(ElementType.TYPE_USE)  
@Retention(RetentionPolicy.RUNTIME)  
public @interface NonNull {  
}

这个注解被定义为@Target(ElementType.TYPE_USE),这表示它可以用在任何类型使用的地方,如变量声明、方法参数、返回值等。

然后,可以在任何类型使用的地方使用这个注解,如下所示:

public class Example {  
    @NonNull String nonNullString;  
    void method(@NonNull String param) { ... }  
}

在这个例子中,@NonNull注解被用于表示nonNullString变量和method方法的参数应该是非空的。如果试图给这些变量或参数赋一个空值(如null),那么编译器会发出警告。

此外,类型注解也可以用于增强现有的代码。例如,如果有一个现有的Java库,可以为它的方法参数或返回值添加类型注解,以表示这些值应该是非空的。然后,可以使用工具来检查这个库的使用,以确保所有的非空注解都被正确地处理。