Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以使用Java中的注释来替换访问器?_Java_Annotations_Metaprogramming - Fatal编程技术网

有没有一种方法可以使用Java中的注释来替换访问器?

有没有一种方法可以使用Java中的注释来替换访问器?,java,annotations,metaprogramming,Java,Annotations,Metaprogramming,我对Java 5注释有点陌生,我很好奇这两种注释是否都可能: 此注释将为您生成一个简单的getter和setter @attribute private String var = ""; @NotNull注释表示变量不能为null,因此您不必每次都编写样板代码 /* * @param s @NotNull */ public void setString(String s){ ... } 这两种方法都有效吗?如果可以的话,它们似乎是我写注释的第一件事。因为我在阅读文档时并没有看到

我对Java 5注释有点陌生,我很好奇这两种注释是否都可能:

此注释将为您生成一个简单的getter和setter

@attribute
private String var = "";
@NotNull
注释表示变量不能为null,因此您不必每次都编写样板代码

/*
 * @param s @NotNull
 */
public void setString(String s){
    ...
}
这两种方法都有效吗?如果可以的话,它们似乎是我写注释的第一件事。因为我在阅读文档时并没有看到太多关于这些的内容,所以我假设它并不是真正意义上的注释。如有任何指示,将不胜感激

是否有一种在中使用注释的方法 Java将取代访问器

简言之,不,Java 5/6编译器不支持这一点,第三方很难以与编译器无关的方式添加这种支持

为了更好地处理注释,我首先从。如果您为版本3(预注释)和版本4(基于注释)编写代码,您将很快了解框架如何将基于命名模式的契约替换为基于注释的契约


对于一个更引人注目的例子,请比较EJB2和EJB3。

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

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

如果你喜欢这种功能,那么看看。这将为您提供我认为您需要的代码生成预处理

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


编辑:精确地解决了getter和setter生成的问题。

您所指的@attribute也不能用于注释,因为它们现在在Java中(正如jamesh指出的那样)

您可能正在寻找的是Java中尚不存在的“”。但是is现在是一个非常热门的话题,我们可能会在Java7或者Java8中得到它们(因为我仍然停留在1.4.2上,它不会帮助我,但它可能会帮助你)


有一个有趣的讨论暗指在中使用注释实现属性。

有一个名为OVal的项目,我认为它可以满足您的需要。

如果我记得高级的东西AspectJ是需要的,不管没有AspectJ的检查工作多么简单。看看吧


还有Hibernate验证器,也可以查看:p

这是可能的,只是不在声明它们的地方

退房

我有一个类注释如下

package sample;
import com.javadude.annotation.Bean;
import com.javadude.annotation.Property;
import com.javadude.annotation.PropertyKind; 

@Bean(properties={
    @Property(name="name"),
    @Property(name="phone", bound=true),
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
})
public class Person extends PersonGen {}
它为您生成PersonGen类,包含getter/setter等


处理器还可以做更多的工作。请注意,我正在开发一个新版本,它与当前版本相比有一点API中断

Getters/Setters:是的,这是可能的。()定义了用于生成getter/setter等的注释

比如说

@lombok.Data;
public class Person {
   private final String name;
   private int age;
}
将生成
getName
(由于变量是最终变量,因此没有设置程序)和
getAge
/
setAge
。它还将生成
equals
hashCode
toString
和一个初始化所需字段的构造函数(
name
)。添加
@allargsconstuctor
将生成初始化这两个字段的构造函数。使用而不是
@Data
将使对象不可变

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

Lombok非常易于使用:

  • 只需下载jar并使用注释,自动生成的getter/setter就可以在代码中使用,而无需实际拼写
  • 注释只在编译过程中使用,而不是在运行时使用,因此您不会将lombok与jar一起分发
  • 大多数IDE都支持这一点,因此您可以在Netbeans中看到代码完成、导航等方面的getter/setter。在IntelliJ IDEA中使用

NotNull:这是由findbugs和IDEA IDE支持的,可能还有其他的

虽然它们有时很有用,但是如果您严重缺少属性,那么您可能在整个OO设计方面有点不稳定

OO设计的思想是,方法是“动作”,你要求对象为你做一些事情——不仅仅是设置或获取一个值——这不是一个对象,而是一个结构

如果您认为缺少属性是一个严重的问题,我强烈建议您尝试编码一段时间,而不要使用setter和getter

一开始可能很难,但我打赌最后你会对OO设计原则有更坚定的理解


(注意:在很少的情况下,您必须在构建对象之后执行“setter”类型的操作——最常见的情况是必须创建两个相互引用的对象。在这种情况下,我建议使用类似于生成器模式的方法,在这种情况下,必须调用一次setter,并防止调用两次setter)

可能帮不了我多少忙。我刚刚离开Java1.4,这只是为了这个项目。啊,甲骨文的前沿。你可以创建一个超类。。。看,我只能在这里不同意你的意见。我通常需要做的不仅仅是在setter中设置一个属性(null检查、其他数据约束验证),我还练习在getter中检查null列表并返回空列表(在其他健全性检查中)。因为我有这个习惯,我更喜欢通过相同的机制,访问器来设置和获取它们。此外,如果您有其他人参与