Qual é a diferença entre interface e @interface em java?

306

Eu não toquei em Java desde que usei o JBuilder no final dos anos 90, na Universidade, por isso estou um pouco desconectado - de qualquer forma, estive trabalhando em um pequeno projeto Java esta semana e usando o Intellij IDEA como meu IDE , para uma mudança de ritmo em relação ao meu desenvolvimento regular em .Net.

Percebo que ele tem suporte para adicionar interfaces e @interfaces, o que é uma @interface e como ela difere de uma interface normal?

public interface Test {
}

vs.

public @interface Test {
}

Pesquisei um pouco, mas não consegui encontrar muitas informações úteis referentes a @interface.

Bittercoder
fonte

Respostas:

322

O símbolo @ indica uma definição de tipo de anotação.

Isso significa que não é realmente uma interface, mas um novo tipo de anotação - para ser usado como um modificador de função, como @override .

Veja esta entrada javadocs sobre o assunto.

mrkishi
fonte
7
Muito obrigado, bom saber. Então, qual foi a justificativa para chamá-lo de @interface, em vez de dizer @notation me pergunto .. parece um termo desnecessariamente sobrecarregado.
Bittercoder
5
O tutorial e o JLS aludem a uma anotação como um tipo especial de interface. Parece não haver muita discussão sobre o assunto, mas javarunner.blogspot.com/2005/01/annotations-in-java-15.html explica que as anotações são uma extensão implícita da interface Annotation e @ e interface são usados ​​para diferenciar juntos de uma interface regular. Você também pode querer ler a especificação JSR para anotações.
DavidValeri 28/05/09
1
@Bittercoder os documentos mencionam: "a interface da palavra-chave é precedida pelo sinal de arroba (@) (@ = AT, como no tipo de anotação)". Essa é toda a lógica que posso encontrar na nomeação errada.
Shaishav 6/09/17
112

interface:

Em geral, uma interface expõe um contrato sem expor os detalhes subjacentes da implementação. Na Programação Orientada a Objetos, as interfaces definem tipos abstratos que expõem o comportamento, mas não contêm lógica. A implementação é definida pela classe ou tipo que implementa a interface.

@interface: (tipo de anotação)

Veja o exemplo abaixo, que tem muitos comentários:

public class Generation3List extends Generation2List {

   // Author: John Doe
   // Date: 3/17/2002
   // Current revision: 6
   // Last modified: 4/12/2004
   // By: Jane Doe
   // Reviewers: Alice, Bill, Cindy

   // class code goes here

}

Em vez disso, você pode declarar um tipo de anotação

 @interface ClassPreamble {
   String author();
   String date();
   int currentRevision() default 1;
   String lastModified() default "N/A";
   String lastModifiedBy() default "N/A";
   // Note use of array
   String[] reviewers();
}

que pode anotar uma classe da seguinte maneira:

@ClassPreamble (
   author = "John Doe",
   date = "3/17/2002",
   currentRevision = 6,
   lastModified = "4/12/2004",
   lastModifiedBy = "Jane Doe",
   // Note array notation
   reviewers = {"Alice", "Bob", "Cindy"}
)
public class Generation3List extends Generation2List {

// class code goes here

}

PS: muitas anotações substituem comentários no código.

Referência: http://docs.oracle.com/javase/tutorial/java/annotations/declaring.html

mavis
fonte
11
boa explicação
Pat B
2
Isso foi realmente útil. Eu não sabia que Java poderia fazer isso.
Jay Sidri
A resposta anterior incluía este link, de onde vieram essas informações. Achei útil encontrar mais informações sobre este tópico. docs.oracle.com/javase/tutorial/java/annotations/declaring.html
PatS
1
Uma das melhores e completas respostas (ainda que claras) que eu tenho testemunhado no stackoverflow.
Sr. D
32

A interfacepalavra-chave indica que você está declarando uma classe de interface tradicional em Java.
A @interfacepalavra-chave é usada para declarar um novo tipo de anotação.

Consulte o tutorial docs.oracle em anotações para obter uma descrição da sintaxe.
Consulte o JLS se você realmente quiser entrar em detalhes sobre o que @interfacesignifica.

DavidValeri
fonte
18

interface: define o contrato para uma classe que o implementa

@interface: define o contrato para uma anotação

Emmanuel Osimosu
fonte
8

A interface na linguagem de programação Java é um tipo abstrato usado para especificar um comportamento que as classes devem implementar. Eles são semelhantes aos protocolos. As interfaces são declaradas usando a palavra-chave interface

@interface é usado para criar suas próprias anotações Java (personalizadas). As anotações são definidas em seu próprio arquivo, assim como uma classe ou interface Java. Aqui está um exemplo de anotação Java personalizado:

@interface MyAnnotation {

    String   value();

    String   name();
    int      age();
    String[] newNames();

}

Este exemplo define uma anotação chamada MyAnnotation que possui quatro elementos. Observe a palavra-chave @interface. Isso sinaliza para o compilador Java que esta é uma definição de anotação Java.

Observe que cada elemento é definido de maneira semelhante a uma definição de método em uma interface. Tem um tipo de dados e um nome. Você pode usar todos os tipos de dados primitivos como tipos de dados do elemento. Você também pode usar matrizes como tipo de dados. Você não pode usar objetos complexos como tipo de dados.

Para usar a anotação acima, você pode usar um código como este:

@MyAnnotation(
    value="123",
    name="Jakob",
    age=37,
    newNames={"Jenkov", "Peterson"}
)
public class MyClass {


}

Referência - http://tutorials.jenkov.com/java/annotations.html

Piyush Singh
fonte