文档

Java™ 教程-Java Tutorials 中文版
Trail: Learning the Java Language
Lesson: Annotations
主页>学习 Java 语言>注解

问题和练习的答案:注解

问题

  1. 问题:以下接口有什么问题:

    public interface House {
        @Deprecated
        public void open();
        public void openFrontDoor();
        public void openBackDoor();
    }
    

    答案文档应该反映出为什么不推荐使用 open 以及使用什么。例如:

    public interface House { 
        /**
         * @deprecated use of open 
         * is discouraged, use
         * openFrontDoor or 
         * openBackDoor instead.
         */
        @Deprecated
        public void open(); 
        public void openFrontDoor();
        public void openBackDoor();
    }
    
  2. 问题:考虑问题 1 中所示的 House 接口的这种实现。

    public class MyHouse implements House {
        public void open() {}
        public void openFrontDoor() {}
        public void openBackDoor() {}
    }
    

    如果编译此程序,编译器会生成警告,因为不推荐使用 open(在接口中)。你能做些什么来摆脱那个警告?

    答案:你可以弃用 open 的实现:

    public class MyHouse implements House { 
        // The documentation is 
        // inherited from the interface.
        @Deprecated
        public void open() {} 
        public void openFrontDoor() {}
        public void openBackDoor() {}
    }
    

    或者,你可以取消警告:

    public class MyHouse implements House { 
        @SuppressWarnings("deprecation")
        public void open() {} 
        public void openFrontDoor() {}
        public void openBackDoor() {}
    }
    
  3. 以下代码是否可以正常编译而不出错?为什么或者为什么不?

    public @interface Meal { ... }
    
    @Meal("breakfast", mainDish="cereal")
    @Meal("lunch", mainDish="pizza")
    @Meal("dinner", mainDish="salad")
    public void evaluateDiet() { ... }
    

    答案:代码无法编译。在 JDK 8 之前,不支持可重复的注解。从 JDK 8 开始,代码无法编译,因为 Meal 注解类型未定义为可重复。可以通过添加 @Repeatable 元注解并定义容器注解类型来修复它:

    @java.lang.annotation.Repeatable(MealContainer.class)
    public @interface Meal { ... }
    
    public @interface MealContainer {
        Meal[] value();
    }
    

练习

  1. Exercise:为元素 idsynopsisengineerdate。为工程师指定默认值 unassigned,为日期指定 unknown

    答案:

    /**
     * Describes the Request-for-Enhancement (RFE) annotation type.
     */
    public @interface RequestForEnhancement {
        int id();
        String synopsis();
        String engineer() default "[unassigned]";
        String date() default "[unknown]";
    }
    

Previous page: Questions and Exercises: Annotations