繁体   English   中英

Java Getter 和 Setter

[英]Java Getters and Setters

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

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

Spring有这样的东西吗?

甚至 C# 也有属性。

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

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

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

我创建了一些不是特定于 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 正式不支持它并且可能会中断 - 我可能对它的工作方式有误,但根据我所看到的,他们必须这样做)

享受! ——斯科特

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

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

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

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

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

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

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

没有更好的方法是语言的一部分 - 没有什么像“属性”关键字那样。

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

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

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

作为可能的替代方案,您是否尝试过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

尝试这样的事情:

@Getter @Setter 私有整数年龄 = 10;

更多信息如下:

https://projectlombok.org/features/GetterSetter

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

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

这是 IDE 生成重复冗长代码作为 getter/setter 的工作

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

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

好吧,一种选择是不要那么害怕公共领域。 对于您知道永远不会在 get 和 set 上进行验证或额外工作的简单类,公共字段需要更少的样板,在语法上更好,并且更有效。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM