(没有)Java中的属性?

Ish*_*eel 55 java getter-setter

所以,直到最近我才故意让自己保持Java n00b,而我的第一次真实曝光带来了轻微的冲击:Java没有C#风格属性!

好的,我可以忍受.但是,我也可以发誓,我已经在一个代码库中看到了Java中的属性getter/setter代码,但我不记得在哪里.这是怎么实现的?是否有语言扩展?它与NetBeans有关吗?

Cal*_*lum 64

Java中的getter和setter有一个"标准"模式,称为Bean属性.基本上任何get以不带参数和返回值开头的方法都是名为方法名称其余部分的属性的getter(使用小写的起始字母).同样set使用单个参数创建一个void方法的setter.

例如:

// Getter for "awesomeString"
public String getAwesomeString() {
  return awesomeString;
}

// Setter for "awesomeString"
public void setAwesomeString( String awesomeString ) {
  this.awesomeString = awesomeString;
}
Run Code Online (Sandbox Code Playgroud)

如果你问的话,大多数Java IDE会为你生成这些方法(在Eclipse中它就像将光标移动到字段并按ctrl-1,然后从列表中选择选项一样简单).

为了它的价值,为了便于阅读,您实际上也可以使用ishas代替get布尔类型属性,如:

public boolean isAwesome();

public boolean hasAwesomeStuff();
Run Code Online (Sandbox Code Playgroud)


Ale*_*-A. 32

我很惊讶没有人提到项目lombok

是的,目前java中没有属性.还有一些其他缺失的功能.
但幸运的是,我们有项目lombok试图改善这种情况.它每天也越来越受欢迎.

所以,如果你使用lombok:

@Getter @Setter int awesomeInteger = 5;
Run Code Online (Sandbox Code Playgroud)

该代码将生成getAwesomeIntegersetAwesomeInteger为好.所以它与C#自动实现的属性非常相似.

你可以在这里获得更多关于lombok getters和setter的信息.
你一定要查看其他功能.我最喜欢的是:

Lombok与IDE很好地集成,因此它将显示生成的方法,如果它们存在(建议,类内容,转到声明和重构).
lombok唯一的问题是其他程序员可能不知道它.您总是可以对代码进行删除,但这是一种解决方法而不是解决方案.

  • @JonnyLeeds好,怎么样都不好?你可以通过发现``@ Getter``和``@ Setter``注释在代码中看到它们,它们也会在其他工具栏中显示(如大纲或建议) (7认同)
  • 拥有你在代码中看不到的方法似乎更糟糕.c#中的自动属性只是故事的一半 - 主要是关于命名和分组相关逻辑. (3认同)

Che*_*oft 8

"Java Property Support"是针对Java 7提出的,但并未将其纳入语言.

如果感兴趣,请参阅http://tech.puredanger.com/java7#property以获取更多链接和信息.


Han*_*Gay 6

bean约定是编写如下代码:

private int foo;
public int getFoo() {
    return foo;
}
public void setFoo(int newFoo) {
    foo = newFoo;
}
Run Code Online (Sandbox Code Playgroud)

在JVM上的一些其他语言中,例如Groovy,您可以获得类似于C#的可覆盖属性,例如,

int foo
Run Code Online (Sandbox Code Playgroud)

可以通过简单的方式访问,.foo并利用默认getFoosetFoo可以根据需要覆盖的实现.


dan*_*uch 6

public class Animal {

    @Getter @Setter private String name;
    @Getter @Setter private String gender;
    @Getter @Setter private String species;
}
Run Code Online (Sandbox Code Playgroud)

这类似于C#属性.这是http://projectlombok.org/

  • @millimoose你只需要一个IDE插件.遗憾的是,每个使用此类代码的人都需要 (2认同)
  • "你需要一个IDE的插件"让我想要卷起一份报纸并打电话给负责它的人.(虽然可以说在IDE配置是代码库的主要构建系统的情况下更多.) (2认同)