对问题和练习的答案:注解
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();
}
- 问题 :考虑对
House
interface的此实现,如问题 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
- 锻炼 :使用元素
id
,synopsis
,engineer
和date
定义增强请求的 注解 类型。将默认值指定为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]";
}