我有兴趣在开发过程中找出哪些Java注释人们认为最有用。这不一定限于核心Java API,您可以包含您在第三方库中找到的注释或您自己开发的注释(确保包含指向源的链接)。
我真的对常见开发任务感兴趣,而不是知道为什么JPA中的@ManyToOne(optional=false)
很棒......
包括注释和对一般开发有用的原因的描述。
答案 0 :(得分:21)
我为其他用户发了一堆upvotes,但只是给我的两分钱,我在开发中使用的唯一三个注释是编译器直接使用的主要注释:
@Override - 非常适合在覆盖其他方法时在代码中使其显式化。如果您没有按照您认为的方式覆盖方法,还有被标记为编译错误的额外好处(请参阅此other SO post)。此标志通知编译器您打算覆盖某些内容,因此如果不这样(例如,您忘记了方法签名中的参数),编译器将捕获它。
@Deprecated - 指出您标记的任何内容,从此时起不应使用的内容。编译器将生成警告,以使用您标记为已弃用的任何代码元素。一般来说,弃用表示“过去曾出现在这里,但未来的版本可能会消失。”确保你也使用相关的“@deprecated”Javadoc标志,以告诉人们应该使用它们。
@SuppressWarnings - 告诉编译器抑制否则会生成的特定警告。这对于有意使用弃用方法的内容非常有用,您可以阻止弃用警告。我倾向于使用它来阻止每个人在序列化类上最喜欢的“序列化UID”警告(无论你是否应该这样做,这是另一次的辩论)。对于那些您知道正在做的事情正在产生警告的情况,只是方便,但您100%确定这是您想要的正确行为。
查看Sun Annotations Guide并查看“编译器使用的注释”部分。这三个讨论相当冗长。
答案 1 :(得分:13)
Java Concurrency in Practice注释
非常有用于准确描述您的代码是如何或不是线程安全的......
答案 2 :(得分:11)
我发现Brian Goetz在他的“Java Concurrency In Practice”一书中定义的与并发相关的注释非常有用:
它们特别有用,因为FindBugs具有使用它们的模式。
免费提供jar和文档答案 3 :(得分:9)
@Override有我的投票。它可以立即清楚您的方法是什么,并使您的代码更具可读性。
答案 4 :(得分:7)
@Test
(JUnit 4)这使得编写和理解测试文件变得更加清晰。此外,添加expected
属性的功能已经在这里和那里保存了几行代码。
答案 5 :(得分:7)
@Deprecated
@deprecated
,但是这个注释是一种很好的方法来使它成为关于方法本身的元信息,而不是文档中的注释。)答案 6 :(得分:7)
就我个人而言,我一直在关注 JSR303 Bean Validation 及其提供的注释,我想这些将变得更加普遍,到目前为止只有少数JSR实现,但它们提供了注释如:
@NotNull private String name;
@NotNull @Size(min = 5, max = 30) private String address;
答案 7 :(得分:6)
这些应该是有用的,您可以在项目中定义它们以更好地传达意图:
答案 8 :(得分:3)
Junit 4提供了非常有用的注释。 Here's a tutorial说明了注释的用法来定义测试。
e.g。
@Test(expected= IndexOutOfBoundsException.class) public void empty() {
new ArrayList<Object>().get(0);
}
正如Dan在下面指出的那样,TestNG最初是这样做的。
答案 9 :(得分:3)
以下是我在日常开发中使用的一些注释
弹簧:
JUnit的:
JPA:
我只包含了最重要的内容。您可以从以下链接中找到有关所有JPA注释的详细信息。
http://www.oracle.com/technology/products/ias/toplink/jpa/resources/toplink-jpa-annotations.html
答案 10 :(得分:2)
@Given
允许一个JUnit测试构建另一个测试的返回值。需要JExample。
答案 11 :(得分:2)
我们开始使用名为 lombok (http://projectlombok.org/)的编译时工具。您注释类,成员等,并在编译时自动生成方法。它提高了生产力,节省了数百行繁琐的编码。
您想要自动生成toString()
方法吗?只需使用@ToString
注释您的课程。
厌倦了为你的成员定义getter和setter?使用@Getter
和/或@Setter
为您的课程添加注释,然后自动添加。
想要一台SLF4J记录器来记录东西吗? @Slf4j
为您创建一个私有静态最终记录器。
@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插件。
答案 12 :(得分:0)
我开始了一个周末项目,使用方法和参数注释来实现Programming By Contract框架,例如
... myMethod(@NotNull String a,@ NotNullOrEmpty String b){
if ( !validate() ){
raiseException ..
}
}
我自动陷入了获取参数值的问题。 Java反射没有它。在我遇到这个限制之前,我从未理解过几个人对Java的咆哮。
答案 13 :(得分:0)
@FunctionalInterface
用于传达特定接口的功能。如果删除了单个抽象方法,则会引发编译错误。