我一遍又一遍地读到 Java 5 的注释是该语言的“高级特性”。直到最近,我还没有过多地使用注解(除了通常的 @Override 和 &c),但是在一些与 web 服务相关的项目上的工作迫使我不得不动手。自从我在 5 岁之前学习了 Java,我从来没有真正花时间坐下来了解注释系统。
我的问题-你们真的使用注释吗?他们每天对你有多大帮助?有多少 StackOverflow 人不得不编写自定义注解?
我一遍又一遍地读到 Java 5 的注释是该语言的“高级特性”。直到最近,我还没有过多地使用注解(除了通常的 @Override 和 &c),但是在一些与 web 服务相关的项目上的工作迫使我不得不动手。自从我在 5 岁之前学习了 Java,我从来没有真正花时间坐下来了解注释系统。
我的问题-你们真的使用注释吗?他们每天对你有多大帮助?有多少 StackOverflow 人不得不编写自定义注解?
也许 Java Annotations 最有用和最常用的案例是使用 POJO + Annotation 代替 xml 配置文件
我经常使用它,因为(正如您已经说过的)如果您使用 Web 框架(如 spring 或 seam),它们通常有很多注释可以帮助您。
我最近编写了一些注释来构建自定义状态机、验证目的和注释的注释(使用它的元数据方面)。并且 IMO 它们有助于使代码更清晰、更易于理解和管理。
当前项目(200KLOC),我一直使用的注释是:
@NotNull / @Nullabe
@Override
@Test
@Ignore
@ThreadSafe
@Immutable
但是我还没有写我自己的注释……但是!
我已将注释用于:
我为以下内容创建了注释:
当我需要获取有关我正在使用的对象的更多信息时,我创建的注释会通过反射读取。它有效,而且效果很好。
注释仅适用于框架,它们在 hibernate/jpa 中工作得很好。除非您编写了一个框架,该框架需要从传递给它的对象中获取一些额外信息,否则您不会编写自己的注释。
但是有一个新的很酷的 junit 功能,可以让你在测试中编写自己的注释 - http://blog.mycila.com/2009/11/writing-your-own-junit-extensions-using.html
我们只是使用注释来创建一种简单的方法来验证我们的 POJO:
@NotEmpty
@Pattern(regex = "I")
private String value;
然后我们通过Hibernate 验证器运行它,它将为我们完成所有验证:
import org.hibernate.validator.ClassValidator;
import org.hibernate.validator.InvalidValue;
public void validate(T validateMe) {
ClassValidator<T> validator = new ClassValidator<T>((Class<T>) validateMe.getClass());
InvalidValue[] errors = validator.getInvalidValues(validateMe);
}
效果很好。漂亮干净的代码。
我们使用自定义注释作为我们集成测试系统的一部分:
@Artifact:将集成测试与问题 ID 相关联。然后为我们的测试和监管部门自动生成跟踪矩阵。
@Exclude:忽略基于浏览器平台/版本的集成测试。防止 IE 6 错误阻塞我们的夜间测试运行 :)
@SeleniumSession:为每个集成测试定义测试特定的 selenium 设置。
它们是一个非常强大的工具,但你必须小心使用它们。看看那些早期的 .NET Enterprise 类文件,看看强制注释是什么噩梦 :)
我每天都使用注释,它们很棒。我将它们与 jsf 和 jpa 一起使用,发现它们比替代 XML 配置更易于管理和使用。
我们有一个报告生成器作为我们的 web 应用程序的一部分。用户可以添加大量小部件,这些小部件都是同一组主题(图形、表格等)的小变体。
UI 基于小部件类中的自定义注释自行构建。(例如,注释可能包含将呈现为下拉列表的默认值和有效值。或指示字段是否为必填项的标志)。
事实证明,这是一种让开发人员无需触摸 UI 即可制作小部件的好方法。
我使用注释在我的状态同步系统中描述哪些类是被注释类的特化,以及它们应该被使用的环境(当一个对象被创建时,它会计算出它的实体列表,这是最好的实体类为网络上的节点创建;即,服务器节点的 Player 实体改为 ServerPlayer 实体)。此外,还描述了类中的属性以及它们应如何跨机器同步。