有用的Java注解

19

我对了解在开发中人们认为哪些Java注解最有用感兴趣。这不一定要限于核心的Java API,你可以包括第三方库中发现的注解或自己开发的注解(请确保包含源链接)。

我真正感兴趣的是常见的开发任务,而不是知道为什么JPA中的@ManyToOne(optional=false)很棒...

请包括注解及其在一般开发中有用的描述。

14个回答

21

我给其他用户分发了一大堆赞,但就我自己而言,在开发中我只使用了编译器直接使用的三个主要注解:

@Override - 用于在代码中明确表明你正在重写另一个方法。此外,它还有一个额外的好处,如果你没有按照你认为的那样覆盖方法(请参阅这个其他SO帖子),它会被标记为编译错误。此标志告诉编译器你打算覆盖某个东西,所以如果你没有这样做(比如在方法签名中遗漏了参数),编译器会捕获它。

@Deprecated - 表示你所标记的任何内容从现在开始不应该再使用。编译器将为你标记为过时的任何代码元素生成警告。通常,"过时"表示 "这个已经存在过,但在将来的版本中可能会消失"。确保你还使用与此相关的 "@deprecated" Javadoc 标志,告诉人们应该使用什么代替。

@SuppressWarnings - 告诉编译器抑制它本来应该生成的特定警告。这对于当你有意想要使用已过时的方法时非常有用,你可以屏蔽过时的警告。我经常使用它来屏蔽大家最喜欢的可序列化类的 "Serialization UID" 警告(无论你是否应该这样做是另一个时间的另一个辩论)。只需在你知道某些行为会生成警告的情况下使用它,但你确信这是你想要的正确行为。

查看Sun注解指南,并查看 "编译器使用的注解" 部分。这三个注解都有一个相当详细的讨论。


13

12

我发现Brian Goetz在他的书"Java Concurrency In Practice"中定义的与并发相关的注释非常有用:

  • @GuardedBy
  • @Immutable
  • @NotThreadSafe
  • @ThreadSafe

它们尤其适用于FindBugs中使用它们的模式。

可以在http://www.javaconcurrencyinpractice.com/上免费获取包和文档。


9

@Override获得了我的支持。它可以立即清晰地表明你的方法是关于什么的,并使你的代码更易读。


并且在大多数集成开发环境中标记不正确重写的方法。 - Rob Hruska
我不同意。使用现代IDE,这是多余和无用的。我不明白为什么这个网站上会出现这么多@ Override,是因为Eclipse默认添加了它,而且很多人使用Eclipse吗? - irreputable
1
并非所有的构建都发生在IDE中。通过Ant、Maven或CI进行批量构建仍然受益于像@Override这样的注释。它们还可以帮助那些拒绝放弃vim的团队成员。 - Greg Mattes
5
就像 Greg 所说的那样,@Override 不仅仅是一个 IDE 的东西,任何可进行注解的 Java 编译器都会检查它。这是一个有用的健全性检查。想象一下,你想让子类的 foo 方法覆盖父类的 foo 方法,但你不小心定义了 class.foo(Object) 和 subclass.foo(SubclassOfObject)。然后假设你有一个名为 "x" 的 "SubclassOfObject" 实例。如果你调用 subclass.foo(x),并且你将 "x" 作为 Object 传递,它将调用 class.foo,但如果你将 "x" 作为 SubclassOfObject 传递,你将得到 subclass.foo。如果你使用 @Override 标记 subclass.foo,编译器就会捕获到这个错误。希望这样说得明白。 - Brent Writes Code

7

@Test

(JUnit 4)让编写和理解测试文件变得更加清晰。此外,添加expected属性的能力已经在某些情况下节省了几行代码。


7

@Deprecated

自Java 5引入

  • 它帮助开发人员在IDE中查看哪些方法已被弃用。(在此之前,大多数IDE仍然可以从特定方法的javadoc注释中提取@deprecated,但这个注解是一种很好的方式,使其成为方法本身的元信息,而不是文档中的注释。)
  • 编译器也会使用它来打印警告,当您使用已弃用的方法时。

3
很遗憾它不能将描述性评论作为参数。我希望看到@deprecated("Unsafe method, use blah blah instead")。 - serg10
1
我认为它不需要参数的原因是因为已经有一个@Deprecated Javadoc标签可以完全做到这一点。 - Brent Writes Code

7

个人而言,我一直在关注JSR303 Bean Validation及其提供的注释,我想它们会变得更加普遍。目前只有少数JSR的实现,但它们提供了诸如以下注释:

@NotNull private String name;
@NotNull @Size(min = 5, max = 30) private String address;

更多信息请查看这里:http://jcp.org/en/jsr/detail?id=303


我在使用FindBugs时经常用到@Nonnull@CheckForNull - Christophe Roussy

6

以下这些注解在你的项目中有助于更好地传达意图:

  • @ThreadSafe(线程安全)
  • @Immutable(不可变)
  • @ValueObject(值对象)
  • @BagOfFunctions(例如java.util.Collections)
  • 等等

5

这里是我在日常开发中使用的一些注解:

Spring:

  1. @Autowired - 用于自动装配bean
  2. @Rollback - 如果设置为true,则会回滚测试用例内执行的所有数据库操作

JUnit:

  1. @Test - 声明一个方法是测试用例
  2. @Ignore - 如果您想忽略任何测试用例
  3. @Before - 在每个测试用例运行之前运行的代码

JPA:

  1. @Entity - 用于标识一个POJO为JPA实体
  2. @Column - 将属性映射到数据库列
  3. @Id - 表示一个Java属性为主键
  4. @EmbeddedId - 用于复合主键
  5. @Transient - 此属性不应持久化
  6. @Version - 用于管理乐观锁定
  7. @NamedQuery - 用于声明本地SQL
  8. @OneToMany - 一对多关系
  9. @ManyToOne - 多对一关系

我只包含了最基本的注释。您可以从以下链接中找到有关所有JPA注释的详细信息。

http://www.oracle.com/technology/products/ias/toplink/jpa/resources/toplink-jpa-annotations.html

http://www.hiberbook.com/


4
我们开始使用一个编译时工具叫做 lombok (http://projectlombok.org/)。你可以为类、成员等注释,方法将在编译时自动生成。它是一个极大的生产力提升,并节省了数百行繁琐的代码。
想要自动生成 toString() 方法吗?只需用 @ToString 注释你的类即可。
厌倦了为成员定义 getter 和 setter 吗?用 @Getter 和 / 或 @Setter 注释你的类,它们将被自动添加。
想要一个 SLF4J 记录器来记录东西吗?@Slf4j 会为你创建一个私有静态 final 记录器。
@Data
public class MyBean {
    // Getters for x and y, setter for y and constructor with x as arg automatically created!
    // toString() and hashCode() methods are there too!
    private final int x;
    private int y;
}

.

@Slf4j
public class SomeClass {
    public void doSomething() {
        log.info("I've got log.");
    }
}

设置非常简单:只需添加一个“provided”maven依赖项即可。还有一个微小的Eclipse/IntelliJ插件。
查看完整功能列表:http://projectlombok.org/features/index.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接