Java Getters和Setters

时间:2009-12-15 13:04:05

标签: java annotations getter-setter

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

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

Spring有这样的东西吗?

即使C#也有属性。

17 个答案:

答案 0 :(得分:64)

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

有些人正在研究其他Java兄弟语言,例如Groovy或Scala。我担心,在JSR找出一种“标准化”的方法来解决这个问题之前,它需要花费几年的时间 - 如果有的话.- / p>

答案 1 :(得分:18)

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

答案 2 :(得分:6)

我创建了一些不是特定于日食的注释。

请参阅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正式不支持它可能会破坏 - 我可能错了它的工作方式,但基于我看到他们必须这样做)

享受! - 斯科特

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

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

我认为属性是一种捷径,但它比一个真正重要的功能更具特色

答案 5 :(得分:3)

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

答案 6 :(得分:3)

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

答案 7 :(得分:2)

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

答案 8 :(得分:2)

没有更好的方式是语言的一部分 - 就像“属性”关键字一样。

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

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

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

答案 9 :(得分:2)

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

答案 10 :(得分:2)

尝试这样的事情:

@Getter @Setter私人年龄= 10;

以下更多信息:

https://projectlombok.org/features/GetterSetter

答案 11 :(得分:1)

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

答案 12 :(得分:1)

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

嗯,一个选择是不要害怕公共领域。对于你知道在get和set下永远不会进行验证或额外工作的简单类,公共字段需要较少的样板,语法更好,效率更高。

答案 15 :(得分:0)

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

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

答案 16 :(得分:0)

IDE的工作是生成重复的详细代码作为getter / setters