Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's is the difference between a static and non-static annotation?

Java's inner classes can be static or non-static. Non-static inner classes are tied to an instance of the enclosing class.

Annotations are a type of Java interface, and like any other class, they can be defined inside a class. Similarly, they can be declared static or non-static. What is the difference between these two choices, is there any difference between how they're used by consuming code, and is there any scenario where it'd make sense to use one or the other?

Example:

public class AnnotationContainer {

  public static @interface StaticAnnotation {}
  public @interface NonstaticAnnotation {}

}
like image 372
Brandon Yarbrough Avatar asked Jun 13 '18 18:06

Brandon Yarbrough


2 Answers

No difference at all. Nested interfaces are always static.

This is described in JLS Sec 8.5.1 (for classes):

A member interface is implicitly static (§9.1.1). It is permitted for the declaration of a member interface to redundantly specify the static modifier.

and JLS Sec 9.5 (for interfaces):

A member type declaration in an interface is implicitly public and static. It is permitted to redundantly specify either or both of these modifiers.

like image 184
Andy Turner Avatar answered Sep 18 '22 02:09

Andy Turner


To expand a bit on Andy's correct answer that they are exactly the same because they are a special kind of interface declaration and "member interfaces" are implicitly static anyway:

JLS 10 9.6. Annotation Types:

An annotation type declaration specifies a new annotation type, a special kind of interface type. To distinguish an annotation type declaration from a normal interface declaration, the keyword interface is preceded by an at-sign (@).

JLS 10 8.5.1. Static Member Type Declarations :

A member interface is implicitly static (§9.1.1). It is permitted for the declaration of a member interface to redundantly specify the static modifier.

and JLS 10 9.1.1. Interface Modifiers

The modifier static pertains only to member interfaces (§8.5.1, §9.5), not to top level interfaces (§7.6).


Side note: interestingly, these Chapters do not use the term "nested interface" defined at the top of Chapter 9, but it seems to be a synonym for "member interface":

JLS 10 Chapter 9. Interfaces:

A nested interface is any interface whose declaration occurs within the body of another class or interface.

like image 21
Hulk Avatar answered Sep 20 '22 02:09

Hulk