61

有没有更好的标准方法在 Java 中创建 getter 和 setter?

必须为每个变量显式定义 getter 和 setter 是非常冗长的。有更好的标准注释方法吗?

Spring有这样的东西吗?

甚至 C# 也有属性。

4

17 回答 17

69

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

有些人正在寻找替代的 Java 兄弟语言,例如 Groovy 或 Scala。恐怕需要几年时间——如果有的话——JSR 会找到一种“标准化”的方式来在 Java 中“修复”这个问题。

于 2009-12-15T13:11:08.977 回答
19

Eclipse 有一个上下文菜单选项,可以为您自动生成这些,我相信许多其他 IDE 都会这样做。

于 2009-12-15T13:10:10.400 回答
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 官方不支持它并且可能会中断 - 我可能对它的工作方式有误,但根据我所看到的,他们必须这样做)

享受!——斯科特

于 2009-12-22T18:50:48.533 回答
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
于 2009-12-15T13:52:43.013 回答
3

我同意 getter/setter 是冗长的。正如其他人所建议的那样, Project Lombok 对此有很好的答案。否则,您可以使用 IDE 的功能来生成它们。

于 2009-12-22T20:29:18.537 回答
3

这是一篇关于这个主题的有趣文章:http: //cafe.elharo.com/java/why-java-doesnt-need-properties-it-already-has-them/

我认为属性是一种捷径,但它更像是一个小功能而不是一个真正重要的功能

于 2009-12-15T13:11:42.330 回答
3

还有带有 @RooJavaBean 注解的 Spring Roo 项目。它也有 @RooToString 和 @RooHashCodeEquals 或类似的东西。它在后台使用适当的方法生成一个 AspectJ 文件。

于 2014-05-15T20:11:04.700 回答
3

大多数 IDE 提供了生成代码的快捷方式(例如Eclipse:右键单击 -> Source -> Generate Getters & Setters),尽管我意识到这可能不是您要寻找的答案。

一些 IOC 框架允许您注释属性,以便它们可以在框架的上下文中使用,例如 Tapestry IOC 和最新的 Spring,我认为(但这种用法仅限于框架使用)

于 2009-12-15T13:10:39.010 回答
2

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

于 2009-12-15T13:13:17.070 回答
2

作为语言的一部分,没有比这更好的方法了——没有什么比“property”关键字更好的了。

正如其他人所提到的,一种替代方法是使用您的 IDE 来生成它们。另一个,如果你有很多需要这个的对象,是编写你自己的代码生成工具,它接受一个基类并生成一个带有 getter 和 setter 的包装器。

您也可以简单地将变量公开为公共成员。但是,当您决定添加验证逻辑时,这可能会再次伤害您。

但是,最后一个想法:除非您的类仅用于传输数据,否则它们可能不应该公开其内部状态。IMO,带有getter和setter的“行为”类是一种代码味道。

于 2009-12-15T13:14:39.093 回答
2

尝试这样的事情:

@Getter @Setter private int age = 10;

更多信息如下:

https://projectlombok.org/features/GetterSetter

于 2018-07-25T19:30:06.613 回答
1

是的,你有点不走运。Groovy 会为您生成它们,但在标准 java 中没有骰子。如果您使用 Eclipse,您可以很容易地生成它们,以及生成 hashCode() 和 equals() 函数。

于 2009-12-15T13:10:49.413 回答
1

如果您需要一个只读类,请查看 Java Records。它自动生成 getter 和方法,例如 equals 和 hashcode。但是,此功能并不稳定,目前您可以将其用作实验功能(可能会在 Java 16 上稳定)。 https://dzone.com/articles/introducing-java-record

于 2020-11-26T15:44:59.727 回答
0

如果您使用 emacs,则可以定义一个为您执行此操作的 emacs 宏。那里有任何emacs大师吗?:)

于 2009-12-22T18:54:02.203 回答
0

这是 IDE 的工作,它生成重复的详细代码作为 getter/setter

于 2009-12-15T14:14:20.553 回答
0

使用您的 IDE 为您生成它,并尽量减少您拥有的 getter/setter 的数量 - 您可能会享受到不变性的额外好处。

我喜欢属性的 C# 语法,我认为它漂亮干净,而且非常干净。

于 2009-12-16T05:01:09.400 回答
0

好吧,一种选择是不要那么害怕公共领域。对于你知道永远不会在 get 和 set 的底层做验证或额外工作的简单类,公共字段需要更少的样板,语法更好,效率更高。

于 2009-12-16T05:08:56.807 回答