Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
问题:以下接口有什么问题:
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();
}
问题:考虑问题 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() {}
}
以下代码是否可以正常编译而不出错?为什么或者为什么不?
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();
}
id,synopsis,engineer 和 date。为工程师指定默认值 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]";
}