您使用Java注释吗?

您使用Java注释吗?,java,annotations,java-5,Java,Annotations,Java 5,可能的重复项: 我一遍又一遍地读到Java5的注释是该语言的一个“高级特性”。直到最近,我还没有太多地使用注释(除了通常的@Override,&c),但是在一些与webservice相关的项目上的工作迫使我不得不这么做。自从我学习JavaPre-5以来,我从未真正花时间坐下来研究注释系统 我的问题-你们真的使用注释吗?他们每天对你有多大帮助?有多少堆栈器必须编写自定义注释?也许Java注释最有用和最常用的情况是使用POJO+注释而不是xml配置文件 我经常使用它,因为(正如您已经说过的)如果

可能的重复项:

我一遍又一遍地读到Java5的注释是该语言的一个“高级特性”。直到最近,我还没有太多地使用注释(除了通常的@Override,&c),但是在一些与webservice相关的项目上的工作迫使我不得不这么做。自从我学习JavaPre-5以来,我从未真正花时间坐下来研究注释系统


我的问题-你们真的使用注释吗?他们每天对你有多大帮助?有多少堆栈器必须编写自定义注释?

也许Java注释最有用和最常用的情况是使用POJO+注释而不是xml配置文件

我经常使用它,因为(正如您已经说过的)如果您使用web框架(如spring或seam),它们通常有大量的注释来帮助您

我最近编写了一些注释来构建自定义状态机、验证目的和注释注释注释(使用它的元数据方面)。在我看来,它们有助于使代码更清晰、更易于理解和管理。

当前项目(200KLOC),我一直使用的注释有:

@NotNull / @Nullabe
@Override
@Test
@Ignore
@ThreadSafe
@Immutable

但我还没有写我自己的注释。。。然而

注释只适用于框架,它们在hibernate/jpa中非常有效。除非您编写的框架需要从传递给它的对象获得一些额外的信息,否则您不会编写自己的注释


然而,有一个新的、很酷的junit特性,允许您在测试中编写自己的注释-

我每天都使用注释,它们非常棒。我将它们与jsf和jpa一起使用,发现它们比其他XML配置更易于管理和使用

我已将注释用于:

  • Hibernate,所以我不需要保存那些巨大的XML文件
  • XML序列化,所以我描述了对象应该如何在对象本身中呈现
  • 针对我不想禁用的警告(以及无法正确解决特定情况的警告)删除警告
我为以下内容创建了注释:

  • 描述执行我的方法所需的状态(例如,用户必须登录)
  • 将我的方法标记为可从具有该平台附加属性的特定平台执行
  • 可能还有其他类似的行动

当我需要获得有关我正在使用的对象的更多信息时,我创建的注释会被反射地阅读。它工作得很好。

我在我的状态同步系统中使用注释来描述哪些类是注释类的专门化,以及它们应该使用的环境(当创建对象时,它将计算出其实体列表,该列表是为网络上的节点创建的最佳实体类;即,服务器节点的播放器实体改为服务器播放器实体)。此外,还描述了类中的属性以及它们应如何跨机器同步。

我们的Web应用程序中有一个报表生成器。用户可以添加大量小部件,这些小部件都是同一组主题(图形、表格等)上的小变化

UI基于小部件类中的自定义注释构建自身。(例如,注释可能包含默认值和有效值,这些值将显示为下拉列表。或者一个指示字段是否为必填字段的标志)


事实证明,这是一种很好的方法,允许开发人员在不接触UI的情况下制作小部件。

我们刚刚使用注释创建了一种验证POJO的简单方法:

@NotEmpty
@Pattern(regex = "I")
private String value;
然后,我们通过将为我们进行所有验证的

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);
}
import org.hibernate.validator.ClassValidator;
导入org.hibernate.validator.InvalidValue;
公共无效验证(T validateMe){
ClassValidator validator=新的ClassValidator((Class)validateMe.getClass());
InvalidValue[]错误=validator.getInvalidValues(validateMe);
}

非常好。代码非常干净。

我们使用自定义注释作为集成测试系统的一部分:

@工件:将集成测试与问题ID相关联。然后自动为我们的测试和监管部门生成跟踪矩阵

@排除:忽略基于浏览器平台/版本的集成测试。防止IE 6错误阻塞我们的夜间测试运行:)

@SeleniumSession:为每个集成测试定义特定于测试的selenium设置


它们是一个非常强大的工具,但你必须小心使用它们。只要看看那些早期的.NET企业级文件,就知道强制注释可能是一场噩梦:)

这是相当主观的。请编辑此问题并将其标记为社区Wiki。这里有一些或多或少相似的问题和有趣的答案:,也就是说,直到你意识到如果你自己写这些问题,你可以用它们做所有有用的事情!