文档

Java™ 教程
教程:学习Java语言
课程:注解
首页 > 学习Java语言 > 注解

问题和练习答案:注解

问题

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

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

    答案:文档应该说明为什么不推荐使用open,以及要使用什么代替。例如:

    public interface House { 
        /**
         * @deprecated 不推荐使用 open,
         * 请使用 openFrontDoor 或 
         * openBackDoor。
         */
        @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 { 
        // 文档继承自接口。
        @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元注解并定义一个容器注解类型来修复:

    public class AnnotationTest {
    
        public @interface MealContainer {
            Meal[] value();
        }
    
        @java.lang.annotation.Repeatable(MealContainer.class)
        public @interface Meal {
            String value();
            String mainDish();
        }
    
        @Meal(value="breakfast", mainDish="cereal")
        @Meal(value="lunch", mainDish="pizza")
        @Meal(value="dinner", mainDish="salad")
        public void evaluateDiet() { }
    }
    

练习

  1. 练习: 为增强请求定义一个注解类型,它包含idsynopsisengineerdate这些元素。为engineer指定默认值为unassigned,为date指定默认值为unknown

    答案

    /**
     * 描述增强请求(RFE)注解类型。
     */
    public @interface RequestForEnhancement {
        int id();
        String synopsis();
        String engineer() default "[unassigned]";
        String date() default "[unknown]";
    }
    

上一页: 问题和练习:注解