自从90年代末在大学里使用JBuilder后,我就没有接触过Java,所以我有点不熟悉Java——无论如何,这周我一直在做一个小的Java项目,并使用Intellij IDEA作为我的IDE,以改变我常规的。net开发的节奏。

我注意到它支持添加接口和@interfaces,什么是@interface,它与普通接口有什么不同?

public interface Test {
}

vs.

public @interface Test {
}

我做了一些搜索,但没有找到大量有用的信息引用@interface。


当前回答

接口 在Java编程语言中,是一种抽象类型,用于指定类必须实现的行为。它们类似于协议。接口使用interface关键字声明

@ interface 用于创建您自己的(自定义)Java注释。注释定义在它们自己的文件中,就像Java类或接口一样。下面是自定义Java注释示例:

@interface MyAnnotation {

    String   value();

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

}

这个例子定义了一个名为MyAnnotation的注释,它有四个元素。注意@interface关键字。这向Java编译器发出信号,表明这是一个Java注释定义。

注意,每个元素的定义都类似于接口中的方法定义。它有一个数据类型和一个名称。可以将所有基元数据类型用作元素数据类型。也可以使用数组作为数据类型。不能使用复杂对象作为数据类型。

要使用上面的注释,你可以使用如下代码:

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


}

参考资料- http://tutorials.jenkov.com/java/annotations.html

其他回答

使用@interface定义注释,使用interface定义接口。

来自Oracle文档:“注释并不直接影响程序语义,但它们确实会影响工具和库处理程序的方式,这反过来又会影响正在运行的程序的语义。注释可以从源文件、类文件或在运行时反射地读取。”

Annotations usually have 2 major uses: They help to define programming contracts (like @Nonnull annotation), which means they actually do nothing, but serve to programmers and IDES to detect potential error codes, and there are runtime annotations, which are usually used by frameworks for configuration (like the @Service annotation in spring): The core detects clases in yous scope with specific annotations and applies logic to them (any example you can think of, like defining Java Servlers, creating singletons, etc)

一般来说,初级程序员在做一些正常的基础工作时,很少需要定义注解,但是接口的定义和使用是任何新开发人员都应该学习的基本知识,如果他们的能力允许的话:好的实践通常建议在代码中使用接口以提高可维护性。

就我个人经验而言,我几乎从学习Java的那一天起就开始定义和使用Java接口,但直到我专业使用Java的5 -6年,我才需要定义一个注释(用现有的注释标记东西是另一回事),而且这是一个非常具体的项目,一个代码自动生成器,有点像Lombok,但对客户来说更具体。

我想这取决于您的工作性质,但是到目前为止,我已经数不清我定义了多少个接口,但是注释可以用双手的手指来数。我相信Java开发人员很有可能在开始和结束他们的整个职业生涯时都不需要定义一个接口(除非您使用swagger基于注释的文档生成xD)

符号@表示注释类型定义。

这意味着它并不是一个真正的接口,而是一种新的注释类型——用作函数修饰符,例如@override。

请参阅此javadocs关于该主题的条目。

interface关键字表明您在Java中声明了一个传统的接口类。 @interface关键字用于声明一个新的注释类型。

见文档。关于Oracle注释教程的语法说明。 如果您真的想了解@interface的详细含义,请参阅JLS。

接口:

通常,接口公开契约而不公开底层实现细节。在面向对象编程中,接口定义了公开行为的抽象类型,但不包含逻辑。实现由实现接口的类或类型定义。

@interface:(注释类型)

以下面这个有很多评论的例子为例:

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

}

相反,您可以声明一个注释类型

 @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();
}

它可以像下面这样注释一个类:

@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: 许多注释取代了代码中的注释。

参考:http://docs.oracle.com/javase/tutorial/java/annotations/declaring.html

接口:为实现该契约的类定义契约

@interface:定义注释的契约