对问题和练习的答案:注解

Questions

  • 问题 :以下interface出了什么问题:
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();
}
  • 问题 :考虑对Houseinterface的此实现,如问题 1 所示。
public class MyHouse implements House {
    public void open() {}
    public void openFrontDoor() {}
    public void openBackDoor() {}
}

如果您编译此程序,则编译器会产生警告,因为不推荐使用open(在interface中)。您可以采取什么措施来消除该警告?

答案 :您可以弃用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() {}
}
  • 下列代码可以正确编译吗?为什么或者为什么不?
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();
}

Exercises

  • 锻炼 :使用元素idsynopsisengineerdate定义增强请求的 注解 类型。将默认值指定为unassigned(工程师)和unknown(日期)。

Answer :

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