Java的Getter和Setter方法

64
有更好的标准方法在Java中创建getter和setter吗?
对于每个变量都要显式定义getter和setter非常冗长。 是否有更好的标准注释方法?
Spring有类似的功能吗?
甚至C#也有属性。

17
我可以为你翻译:这可能不是你想听到的,但大多数IDE都可以为你生成它们。 - Leonard Ehrenfried
回答关于Spring的问题:其实不行。此外,如果你“编程”XML几天后,你会渴望重新编写整洁、简明的getter和setter代码 :) - Carl Smotricz
如果我错了,请纠正我,但您仍然需要编写C#属性,不是吗?这并不意味着它们是隐含的,只有在您想要扩展基本的读/写变量行为时才需要编写它们。它们唯一比getter和setter更好的是将它们保持并排。 - David
3
为什么Lombok的答案没有被标记为答案? - fommil
1
我从未想过我会说这句话,但我想念 Ruby ... - Ciro Santilli OurBigBook.com
17个回答

71

我不确定您是否认为它是“标准”的,但是Project Lombok解决了这个问题。他们使用注解来替换Java的大部分冗长。

有些人正在寻找替代Java兄弟语言,如Groovy或Scala。恐怕需要花费一些时间 - 如果有可能的话- 才能让JSR找到一种“标准化”的方式来在Java中适当地“修复”这个问题。


10
Lombok是一个不错的工具,可以方便地处理hashCode、equals和toString等操作。如果需要创建一些简单的数据类,它是值得考虑的选择。 - Tim
3
赞成使用Lombok作为非常酷的工具,但反对它本质上只适用于特定的集成开发环境(IDE)。在其他任何IDE中,你都会看到大量的错误提示装饰在代码周围,因为IDE不知道发生了什么。我也不确定它如何与调试器配合使用。 - Chris Kessel
1
它也可以与Maven很好地配合使用,而且他们刚刚添加了一个去除Lombok的选项,可以生成没有任何Lombok引用的源代码。 - Tim
2
目前Lombok在Netbeans中确实可以使用,并且也有一些关于JDeveloper的报道。唯一缺失的是IntelliJ,但现在它是开源的,所以可能是可行的。 - Roel Spilker
答案只是说Lombok,但项目链接并没有提供太多帮助,所以请看这里:[https://projectlombok.org/features/GetterSetter],或者更高级一些的[https://projectlombok.org/features/Data]。 - RiZKiT

20

Eclipse有一个上下文菜单选项,可以为您自动生成这些内容,我相信许多其他IDE也有类似的功能。


3
虽然不是最好的解决方案,但这是我们所限制的选择。 - WhyNotHugo
3
每当我对一个有许多字段的东西进行更改时,我只需删除getter和setter,并让eclipse重新生成它们。这只是噪音。 - gtrak

6

我创建了一些不仅限于eclipse的注解。

请参见http://code.google.com/p/javadude/wiki/Annotations

例如:

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 {
}

我的注释生成了一个超类;我认为Lombok修改了正在编译的实际类(这在Sun官方不受支持,可能会出问题 - 我可能对其工作方式有所误解,但根据我看到的情况,他们必须这样做)

祝愉快! -- Scott


4

3
作为一种可能的替代方案,你尝试过Scala吗?它可以编译成Java字节码,并且具有许多有趣的快捷方式,可以让你作为Java程序员的生活更加轻松。
例如,属性:
case class Person(var name:String, 
                  var age:Int);
val p = Person("John", 4)
p.name
p.name = "Charlie"
p.name

并且输出:

defined class Person
p: Person = Person(John,4)
res7: String = John
res8: String = Charlie

从技术上讲,Java是Scala的子集,因此可以使用这种方法来解决问题。 - Martin Wickman
5
我也喜欢Scala(因此给你点了赞),但是问“你试过Scala吗?”有些过分了。Scala与Java有些相似之处,但区别太大了,我曾经尝试过用Scala编写Java代码,但最终放弃了。虽然去掉了getter/setter很令人愉悦,但Scala需要投入很大的精力。 - Carl Smotricz

3
大多数集成开发环境(IDE)提供代码生成的快捷方式(例如,Eclipse:右键单击->源码->生成Getters& Setters),虽然我意识到这可能不是你想要的答案。
一些IOC框架允许您注释属性,以便它们可以在框架的上下文中使用,例如Tapestry IOC和最新版本的Spring(但此用途仅限于框架使用)。

3

1
我花了几年时间在Delphi中进行开发。我一直认为属性是Delphi最好的特性之一。我总是有点难过Java没有这个功能。Anders Hejlsberg将属性构建到C#中,现在微软的人们拥有它们而我们没有。这可能是一个“小”功能,但任何可以减少代码量的东西都可以减少错误并增加可理解性。 - Carl Smotricz
1
Jerome - 我不同意。由于缺乏支持,Java中的绑定目前受到了破坏。想象一下,如果您无法获取静态的.class成员,而必须使用传递字符串来处理。我经常看到人们写道,语言中的属性只是语法糖,但事实并非如此。 - Kevin Day

3

我认为getter/setter方法很啰嗦。其他人建议使用Project Lombok来解决这个问题。否则,你可以使用你的IDE工具来生成它们。


3

还有Spring Roo项目,它带有@RooJavaBean注释。它还有类似@RooToString和@RooHashCodeEquals的内容。它会在后台生成一个带有适当方法的AspectJ文件。


2

使用Netbeans,只需在需要替换getter/setter的位置开始输入get或set,并调用自动完成(Ctrl+Space),它会为您提供生成getter或setter的选项。 它还将为您提供生成构造函数的选项。


Eclipse 也有类似的功能。 - True Soft
而IntelliJ IDEA也是如此。这使得你可以使用3个主要的Java IDE来解决问题。 - Carl Smotricz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接