首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在Java中使用注解来代替访问器?

有没有办法在Java中使用注解来代替访问器?
EN

Stack Overflow用户
提问于 2008-12-08 00:23:22
回答 7查看 7.2K关注 0票数 11

我对Java 5注解还是个新手,我很好奇这两种注解是否有可能实现:

这个注解将为您生成一个简单的getter和setter。

代码语言:javascript
复制
@attribute
private String var = "";

@NotNull注释指示变量不能为空,因此您不必每次都编写样板代码。

代码语言:javascript
复制
/*
 * @param s @NotNull
 */
public void setString(String s){
    ...
}

这两种方法都行得通吗?如果可以,我似乎会首先为它们编写注释。因为我在阅读文档时并没有看到太多关于这些的内容,所以我假设这并不是注释的真正意义所在。这里的任何方向都将不胜感激。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-12-08 10:31:39

注释处理发生在抽象语法树上。这是解析器创建并由编译器处理的结构。

当前的规范(链接在后面)说注释处理器不能改变抽象语法树。这样做的后果之一是它不适合进行代码生成。

如果您喜欢这种功能,那么可以看看XDoclet。这将为您提供我认为您正在寻找的代码生成预处理。

对于您的@NonNull示例,JSR-305是一个用于增强软件缺陷检测的set of annotations,它包括@NonNull@CheckForNull以及许多其他工具。

编辑:Project Lombok恰好解决了getter和setter生成的问题。

票数 15
EN

Stack Overflow用户

发布于 2010-02-03 02:06:02

Getters/Setters:是的,这是可能的。Project Lombok (http://projectlombok.org/index.html)定义了用于生成getter/setter等的注释。

举个例子

代码语言:javascript
复制
@lombok.Data;
public class Person {
   private final String name;
   private int age;
}

将生成getName (没有设置器,因为变量是最终的)和getAge/setAge。它还将生成equalshashCodetoString和初始化必需字段的构造函数(本例中为name)。添加@AllArgsConstructor将生成一个初始化这两个字段的构造函数。使用@Value而不是@Data将使对象不可变。

还有其他注释和参数让您可以控制访问权限( getter是受保护的还是公共的)、名称(getName()还是name()?)等等。例如,我非常喜欢buildersextension methods的注释。

Lombok非常容易使用:

  • 只需下载jar并使用注释,自动生成的getter/setter就可以在您的代码中使用,而无需实际拼写出来。
  • 注释仅在编译期间使用,而不是在运行时使用,因此您不会将lombok与您的jar一起分发。
  • 大多数集成开发环境都支持此功能,因此您可以在代码完成、导航等方面看到getter/setter。在Netbeans中,这适用于out of the box。在IntelliJ IDEA中使用Lombok plugin.

NotNull:这是由findbugs和IDEA集成开发环境支持的,也许其他

票数 14
EN

Stack Overflow用户

发布于 2008-12-08 01:21:03

中有没有办法使用注解来代替访问器?

简而言之,不,Java5/6编译器不支持这一点,第三方很难以编译器不可知的方式添加这样的支持。

为了更好地处理注释,我将从JUnit开始。如果您为版本3(预注释)和版本4(基于注释)编写代码,您很快就会掌握框架如何将基于命名模式的约定替换为基于注释的约定。

有关更生动的示例,请比较EJB2和EJB3。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/348408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档