Java getter 和 setter 是简单的方法吗?
Posted
技术标签:
【中文标题】Java getter 和 setter 是简单的方法吗?【英文标题】:Are Java getters and setters simply methods? 【发布时间】:2016-08-04 19:03:18 【问题描述】:以下是否正确:Java getter 和 setter 只是方法。
我知道它们被实现来操纵或获取私有...属性/字段的值。但是可以称它们为方法吗?
【问题讨论】:
是的,它们都是简单的方法。 是的,它们是检索属性/字段的简单方法,但在设置或获取值之前可能会进行一些检查或操作。 是的,简单的方法通常被称为访问器和修改器,分别用于getter和setter。 是的,他们是。不幸的是,在 java 中除了编写或生成 getter 和 setter 之外,没有其他优雅的方法,这导致了无聊的样板代码。在 C# 中,您可以在字段声明处定义 getter 和 setter,例如:string MyProperty get; set;
@f1sh Lombok 是一种有趣的方式,使用注释和元处理来模拟 C#-esque get; set;
。
【参考方案1】:
是的,没关系,它们只是方法!
【讨论】:
例如,它们与getAge()
(基于出生日期)等“虚拟”计算字段没有什么区别。
调用方法calculateAge()【参考方案2】:
从技术上讲,从语言和 VM 的角度来看,是的,它们只是方法。
但是,一些库和框架认识到它们的特殊性质。例如,JPA 可用于通过注释字段或方法来映射“属性”。 Beans Binding 库使用它们来访问属性,因此如果您在某个对象上有一个 getText() / setText()
对,那么您可以将“text”属性绑定到其他对象的某个其他属性(您仍然需要执行 @987654322 @magic,不过)。但这只是结合了反射的力量的“约定优于配置”现象。
【讨论】:
【参考方案3】:根据JLS,
方法声明可以调用的可执行代码,将固定数量的值作为参数传递。
这个标准也满足 getter 和 setter 的要求;所以我们可以说是java语言中的“方法”。
【讨论】:
【参考方案4】:幸运的是,我能够在 google 中提取 Craig Larman 的“应用 UML 和模式”book 部分。如引述
Accessing methods retrieve(accessor method) or set(mutator method)
attributes. In some languages such as Java it is a common idiom to
have an accessor and mutator for each attribute, and to declare all
attributes private(to enforce data encapsulation). The methods are
excluded in the class diagram because of the high noise-to-value ratio
they generate."
【讨论】:
【参考方案5】:Java Getter 和 Setter 是访问器方法。所以,是的,它们是方法。
许多程序员(Java 或其他)可能会对不断为所有私有字段编写 getXXX()
和 setXXX(type t)
感到恼火,尤其是当它们基本上只是一行方法时。对于这种情况,有一些注解库(如Lombak)通过元编程和Java注解和反射的力量生成这些。
然而,显式编写 getter/setter 的原因有很多。可以在here 找到一个很好的列表。但我也很喜欢this answer。
【讨论】:
【参考方案6】:是的,本质上它们是方法。 Java方法的标准定义如下:
方法是一组通过名称引用的代码,可以在程序中的任何位置简单地通过使用方法的名称来调用(调用)。
-https://mathbits.com/MathBits/Java/Methods/Lesson1.htm
因此,您可以将方法视为类本身中的小程序,它允许我们完成特定任务,这也正是 getter 和 setter 所做的。
【讨论】:
以上是关于Java getter 和 setter 是简单的方法吗?的主要内容,如果未能解决你的问题,请参考以下文章
GroovyGroovy 方法调用 ( Java 类成员及 setter 和 getter 方法设置 | Groovy 类自动生成成员的 getter 和 setter 方法 )