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]";
}