Java教程是为JDK 8编写的。本页面中描述的示例和实践不利用后续版本引入的改进,可能使用不再可用的技术。
请参阅Java语言变化,了解Java SE 9及以后版本中更新的语言功能摘要。
请参阅JDK发行说明,了解所有JDK版本的新功能、增强功能以及已删除或不建议使用的选项。
问题: 以下接口有什么问题:
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(); }
问题: 考虑以下实现了问题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() {} }
以下代码会编译通过吗?为什么会或者为什么不会?
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() { } }
id
、synopsis
、engineer
和date
这些元素。为engineer
指定默认值为unassigned
,为date
指定默认值为unknown
。
答案:
/** * 描述增强请求(RFE)注解类型。 */ public @interface RequestForEnhancement { int id(); String synopsis(); String engineer() default "[unassigned]"; String date() default "[unknown]"; }