# 问题和练习

# 问题

# 问题 1

以下接口有什么问题?

public interface House {
    @Deprecated
    void open();
    void openFrontDoor();
    void openBackDoor();
}
1
2
3
4
5
6

答案:

文档应该反映为什么 open 不推荐使用,而应该使用什么。例如:

public interface House {
    /**
     * @deprecated open 不鼓励使用了,请使用
     * openFrontDoor or
     * openBackDoor 代替.
     */
    @Deprecated
    public void open();
    public void openFrontDoor();
    public void openBackDoor();
}
1
2
3
4
5
6
7
8
9
10
11

# 问题 2

考虑这个接口的实现

public class MyHouse implements House {
    public void open() {}
    public void openFrontDoor() {}
    public void openBackDoor() {}
}
1
2
3
4
5

如果你编译这个程序,编译器会产生一个警告,因为 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() {}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 问题 3

下面的代码能编译吗?为什么?

public @interface Meal { ... }

@Meal("breakfast", mainDish="cereal")
@Meal("lunch", mainDish="pizza")
@Meal("dinner", mainDish="salad")
public void evaluateDiet() { ... }
1
2
3
4
5
6

答:

代码无法编译。在 JDK 8 之前,不支持可重复的注释。从 JDK 8 开始,代码无法编译,因为 Meal 注释类型没有被定义为可重复的。可以通过添加 @Repeatable 元注释和定义容器注释类型来解决这个问题:

@java.lang.annotation.Repeatable(MealContainer.class)
public @interface Meal { ... }

public @interface MealContainer {
    Meal[] value();
}
1
2
3
4
5
6

# 练习

定义与元素的 请求注解类型 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]";
}
1
2
3
4
5
6
7
8
9