所以,直到最近我才故意让自己保持Java n00b,而我的第一次真实曝光带来了轻微的冲击:Java没有C#风格属性!
好的,我可以忍受。但是,我也可以发誓,我已经在一个代码库中看到了Java中的属性getter / setter代码,但我不记得在哪里。这是怎么实现的?是否有语言扩展?它与NetBeans有关吗?
答案 0 :(得分:62)
Java中的getter和setter有一个“标准”模式,称为Bean properties。基本上任何以get
开头,不带参数并返回值的方法,都是名为方法名称其余部分的属性的getter属性(带有小写的起始字母)。同样,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();
答案 1 :(得分:32)
我很惊讶没有人提到project lombok
是的,目前java中没有属性。还有一些其他缺失的功能。
但幸运的是,我们project lombok试图改善这种状况。它每天也越来越受欢迎。
所以,如果你正在使用lombok:
@Getter @Setter int awesomeInteger = 5;
此代码也将生成getAwesomeInteger
和setAwesomeInteger
。所以它与C# auto-implemented properties非常相似。
您可以获得有关lombok getters和setters here的更多信息 你也一定要查看other features。 我最喜欢的是:
Lombok与IDE完美集成,因此它将显示生成的方法,如果它们存在(建议,类内容,转到声明和重构)。
lombok唯一的问题是其他程序员可能不知道它。您始终可以delombok代码,但这是一种解决方法而非解决方案。
答案 2 :(得分:7)
“Java Property Support”是针对Java 7提出的,但没有使其成为该语言。
如果感兴趣,请参阅http://tech.puredanger.com/java7#property了解更多链接和信息。
答案 3 :(得分:6)
bean约定是编写如下代码:
private int foo;
public int getFoo() {
return foo;
}
public void setFoo(int newFoo) {
foo = newFoo;
}
在JVM上的一些其他语言中,例如Groovy,你得到类似于C#的可覆盖属性,例如,
int foo
使用简单的.foo
进行访问,并利用您可以根据需要覆盖的默认getFoo
和setFoo
实现。
答案 4 :(得分:6)
public class Animal {
@Getter @Setter private String name;
@Getter @Setter private String gender;
@Getter @Setter private String species;
}
这类似于C#属性。这是http://projectlombok.org/
答案 5 :(得分:4)
你可能不需要"得到"和"设置"前缀,使它看起来更像属性,你可以这样做:
public class Person {
private String firstName = "";
private Integer age = 0;
public String firstName() { return firstName; } // getter
public void firstName(String val) { firstName = val; } // setter
public Integer age() { return age; } // getter
public void age(Integer val) { age = val; } //setter
public static void main(String[] args) {
Person p = new Person();
//set
p.firstName("Lemuel");
p.age(40);
//get
System.out.println(String.format("I'm %s, %d yearsold",
p.firstName(),
p.age());
}
}
答案 6 :(得分:3)
如果您愿意,Java的大多数IDE都会自动为您生成getter和setter代码。有许多不同的约定,像Eclipse这样的IDE可以让你选择你想要使用哪个,甚至让你自己定义。
Eclipse甚至包括自动重构,允许您将属性包装在getter和setter中,它将修改直接访问属性的所有代码,使其使用getter和/或setter。
当然,Eclipse只能修改它所知道的代码 - 你所拥有的任何外部依赖都可能被这种重构打破。
答案 7 :(得分:3)
来自 Jeffrey Richter的预订 CLR通过C# :(我认为这些可能是JAVA中尚未添加属性的原因)
out
或ref
参数传递给方法;一个领域可以。 System.MarshalByRefObject
),调用属性方法将非常慢,并且
因此,一种方法优于财产。在我看来,类派生自
MarshalByRefObject
永远不应使用属性。System.DateTime
类只有readonly
返回当前日期和时间的Now
属性。每次你查询这个
属性,它将返回不同的值。这是一个错误,微软希望如此
他们可以通过使Now方法而不是属性来修复类。 Environment
的
TickCount
属性是这个错误的另一个例子。答案 8 :(得分:2)
我的Java经验也不是那么高,所以任何人都可以随意纠正我。但AFAIK,一般惯例是编写两种方法:
public string getMyString() {
// return it here
}
public void setMyString(string myString) {
// set it here
}
答案 9 :(得分:1)
如果您正在使用eclipse,那么它具有为内部属性自动生成getter和setter方法的功能,它可以是一个有用且省时的工具。
答案 10 :(得分:1)
我只是发布了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 {
}
还有更多样本可用,并且生成的代码中没有运行时依赖项。
如果您尝试一下并发现它有用,请给我发送电子邮件! - 斯科特
答案 11 :(得分:1)
java中没有property关键字(就像你在C#中找到的那样)在C ++中最接近1字getter / setter的方法就是这样:
public class MyClass
{
private int aMyAttribute;
public MyClass()
{
this.aMyAttribute = 0;
}
public void mMyAttribute(int pMyAttributeParameter)
{
this.aMyAttribute = pMyAttributeParameter;
}
public int mMyAttribute()
{
return this.aMyAttribute;
}
}
//usage :
int vIndex = 1;
MyClass vClass = new MyClass();
vClass.mMyAttribute(vIndex);
vIndex = 0;
vIndex = vClass.mMyAttribute();
// vIndex == 1
答案 12 :(得分:0)
如先前在eclipse中提到的那样,集成开发环境(IDE)通常可以自动创建访问器方法。
您也可以使用NetBeans进行此操作。
要为您的类创建访问器方法,请打开一个类文件,然后在源代码编辑器中的任意位置单击鼠标右键,然后选择菜单命令“重构”,“封装字段”。 将打开一个对话框。单击全选,然后单击重构。 Voilà,
祝你好运
答案 13 :(得分:0)
对我来说,问题有两个方面:
1)所有这些额外的方法{get * / set *}使类代码变得混乱。
2)无法像对待属性一样对待它们:
public class Test {
private String _testField;
public String testProperty {
get {
return _testField;
}
set {
_testField = value;
}
}
}
public class TestUser {
private Test test;
public TestUser() {
test = new Test();
test.testProperty = "Just something to store";
System.out.printLn(test.testProperty);
}
}
这是我想重新使用的一种简单分配。不必使用“方法”调用语法。任何人都可以提供有关Java发生了什么的答案吗?