Documentation
The Java™ Tutorials
Download Ebooks
Download JDK
Search Java Tutorials
Trail: Learning the Java Language
Lesson: Annotations
Home Page > Learning the Java Language > Annotations
« Previous • TOC

# Answers to Questions and Exercises: Annotations

## Questions

1. Question: What is wrong with the following interface:

       public interface House {
           @Deprecated
           public void open();
           public void openFrontDoor();
           public void openBackDoor();
       }

   Answer The documentation should reflect why `open` is deprecated and what to use instead. For example:

       public interface House {
           /**
            * @deprecated use of open
            * is discouraged, use
            * openFrontDoor or
            * openBackDoor instead.
            */
           @Deprecated
           public void open();
           public void openFrontDoor();
           public void openBackDoor();
       }

2. Question: Consider this implementation of the `House` interface, shown in Question 1.

       public class MyHouse implements House {
           public void open() {}
           public void openFrontDoor() {}
           public void openBackDoor() {}
       }

   If you compile this program, the compiler produces a warning because `open` was deprecated (in the interface). What can you do to get rid of that warning?

   Answer: You can deprecate the implementation of `open`:

       public class MyHouse implements House {
           // The documentation is
           // inherited from the interface.
           @Deprecated
           public void open() {}
           public void openFrontDoor() {}
           public void openBackDoor() {}
       }

   Alternatively, you can suppress the warning:

       public class MyHouse implements House {
           @SuppressWarnings("deprecation")
           public void open() {}
           public void openFrontDoor() {}
           public void openBackDoor() {}
       }

3. Will the following code compile without error? Why or why not?

       public @interface Meal { ... }

       @Meal("breakfast", mainDish="cereal")
       @Meal("lunch", mainDish="pizza")
       @Meal("dinner", mainDish="salad")
       public void evaluateDiet() { ... }

   Answer: The code fails to compile. Before JDK 8, repeatable annotations are not supported. As of JDK 8, the code fails to compile because the `Meal` annotation type was not defined to be repeatable. It can be fixed by adding the `@Repeatable` meta-annotation and defining a container annotation type:

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

       public @interface MealContainer {
           Meal[] value();
       }

## Exercises

1. Exercise: Define an annotation type for an enhancement request with elements `id`, `synopsis`, `engineer`, and `date`. Specify the default value as `unassigned` for engineer and `unknown` for date.

   Answer:

       /**
        * Describes the Request-for-Enhancement (RFE) annotation type.
        */
       public @interface RequestForEnhancement {
           int id();
           String synopsis();
           String engineer() default "[unassigned]";
           String date() default "[unknown]";
       }

« Previous • TOC

Previous page: Questions and Exercises: Annotations