(否)Java中的属性?
因此,直到最近我还是故意为自己保留Java n00b,而我的第一次实际接触却引起了轻微的震惊:Java没有Cstyle属性!
好吧,我可以接受。但是,我也可以发誓我已经在一个代码库中看到了Java中的属性获取器/设置器代码,但是我不记得在哪里。那是如何实现的?是否有语言扩展?它与NetBeans有关吗?
解决方案
回答
我的Java经验也不是很高,因此任何人都可以纠正我。但是AFAIK的一般约定是编写两个类似的方法:
public string getMyString() { // return it here } public void setMyString(string myString) { // set it here }
回答
如果我们使用的是eclipse,则它具有为内部属性自动生成getter和setter方法的功能,它可以是一种有用且省时的工具。
回答
Bean约定是这样编写代码:
private int foo; public int getFoo() { return foo; } public void setFoo(int newFoo) { foo = newFoo; }
在JVM上的其他一些语言(例如Groovy)中,我们会获得类似于C#的可覆盖属性,例如
int foo
使用简单的.foo
访问,并利用默认的getFoo和setFoo实现,我们可以根据需要重写这些实现。
回答
Java中有一个用于getter和setter的"标准"模式,称为Bean属性。基本上,任何以get
开头,不带任何参数并返回值的方法都是该方法名称的其余部分(以小写字母开头)的属性获取器。同样," set"会创建一个带有单个参数的void方法的setter。
例如:
// Getter for "awesomeString" public String getAwesomeString() { return awesomeString; } // Setter for "awesomeString" public void setAwesomeString( String awesomeString ) { this.awesomeString = awesomeString; }
如果我们询问大多数Java IDE,它们都会为我们生成这些方法(在Eclipse中,这就像将光标移至某个字段并按ctrl-1,然后从列表中选择选项一样简单)。
出于价值的考虑,为了提高可读性,我们实际上也可以使用is
和has
代替布尔型属性的get方法,例如:
public boolean isAwesome(); public boolean hasAwesomeStuff();
回答
如果需要,大多数Java IDE会自动为我们生成getter和setter代码。有许多不同的约定,像Eclipse这样的IDE允许我们选择要使用的约定,甚至可以定义自己的约定。
Eclipse甚至包括自动重构,它允许我们将属性包装在getter和setter中,它将修改直接访问该属性的所有代码,以使其使用getter和/或者setter。
当然,Eclipse只能修改它知道的有关此类重构可能破坏的任何外部依赖关系的代码。
回答
有人为Java 7提出了" Java属性支持",但并未将其纳入该语言。
如果有兴趣,请参见http://tech.puredanger.com/java7#property以获取更多链接和信息。
回答
我只是发布Java 5/6注释和注释处理器来帮助实现这一点。
查看http://code.google.com/p/javadude/wiki/Annotations
该文档现在有点轻巧,但是quickref应该可以理解这个想法。
基本上,它使用getter / setter(以及许多其他代码生成选项)生成超类。
一个示例类可能看起来像
@Bean(properties = { @Property(name="name", bound=true), @Property(name="age,type=int.class) }) public class Person extends PersonGen { }
有更多示例可用,并且所生成的代码中没有运行时依赖项。
给我发送电子邮件,如果我们尝试它并发现它有用的话!
-斯科特