【问题标题】:Does Java have Automatic Properties?Java有自动属性吗?
【发布时间】:2010-12-14 11:10:03
【问题描述】:

在 c# 中,您可以像这样设置属性:

public int CustomerId {get;set;}

其中设置了一个名为 CustomerId 的自动属性,但我想知道 Java 中是否有类似的东西?

【问题讨论】:

  • Java 是我所说的“低级高级”语言。它是一种高级语言,因为它具有内存管理、面向对象等。但它是低级的,因为编译器几乎没有实现任何“额外”。即使是最简单的模式,如属性,也必须由程序员手动完成(我确信某处有异常)。 (也许它是一种“纯粹的”OOP 语言?)这是一件好事,也是一件坏事。这也是我建议将 Java 作为第一语言的原因之一,因为它可以教授 OOP 基础知识而不会过于复杂。

标签: java language-features


【解决方案1】:

不,Java 目前没有类似的东西。见鬼,Java 中的属性大多只是 get/set 方法的约定,而不是像 C# 中那样被编译器真正理解。工具和库识别 get/set 模式,但语言不知道它们。 (有可能在未来的 Java 版本中,会有更多“正式”的支持。)

不过,一些类似 Java 的语言(例如 Groovy)确实具有自动属性生成功能。

【讨论】:

  • @Tom:是的,在某些方面。不过,我不确定这是否相关……这当然不会使我写的内容无效。
  • @JonSkeet:你能澄清一下你所说的“真正理解”是什么意思吗?我认为 c# 的东西只是同一类事物的语法糖,即具有几个读/写函数的字段?
  • @Carlos:这仍然是一些与元数据绑定在一起的方法(有或没有字段)。但关键是 C# 编译器知道属性——它们是语言的一部分。在 Java 中,它们只是一种约定——编译器不在乎你是否称它们为 getFoosetFoofetchFooputFoo。其他库(例如支持 JavaBeans 的库)可能会,但那是另一回事。
  • 我明白你的意思。 c# 编译器使方法具有特殊的代号,而不是让用户创建 getMyProperty。
  • @Carlos:不仅仅是“特殊代号”——还有元数据表明这些是属性,而属性 do 在 C# 中有自己的语法这一事实是区别。属性在 .NET 框架级别也是已知的,PropertyInfo 等。
【解决方案2】:

不,Java 中没有这样的东西。

然而,在 Eclipse 中,您可以通过 Source > Generate Getters/Setters 自动为字段实现 getter/setter 方法。

【讨论】:

    【解决方案3】:

    您也可以使用Project Lombok 中的注释轻松完成此操作

    【讨论】:

      【解决方案4】:

      不是 Java 语言本身。但是,至少有一个库可以提供该功能。请参阅:http://projectlombok.org/(或更具体:http://projectlombok.org/features/GetterSetter.html

      【讨论】:

      • 看起来不错。还有一些其他注释(.net 开发人员的属性),例如 @cleanup @toString NonNull ...
      【解决方案5】:
      • JavaFX 属性可能也很有趣:

      http://docs.oracle.com/javafx/2/binding/jfxpub-binding.htm

          IntegerProperty num = new SimpleIntegerProperty(666);
          System.out.println(num.getValue());
      
      • 另请参阅有关如何避免获取/设置样板代码的相关问题:

      "Special attributes/properties" instead of getter/setter in Java to avoid boiler plate code

      【讨论】: