【发布时间】:2011-02-08 14:19:57
【问题描述】:
什么是setter和getter?为什么我需要它们?以有效方式使用它们的一个很好的例子是什么? setter 和 getter 的意义何在?
更新: 请给我一些编码示例吗?
【问题讨论】:
-
你可能想在 wiki 上查找 Mutator:en.wikipedia.org/wiki/Mutator_method
标签: oop
什么是setter和getter?为什么我需要它们?以有效方式使用它们的一个很好的例子是什么? setter 和 getter 的意义何在?
更新: 请给我一些编码示例吗?
【问题讨论】:
标签: oop
getter 是一种获取属性值的方法。 setter 是一种设置属性值的方法。关于它们的功效存在一些争论,但要点大致是:
为了封装的完整性
在内部细节发生变化时保持界面一致
当您需要围绕获取或设置添加一些逻辑时更有用,例如在编写值之前对其进行验证。
【讨论】:
getter/setter 用于隐藏私有字段不被公开(您可以避免直接访问字段)。
getter 允许您在内部字段中使用提供的值之前对其进行检查。例如,setter 允许您应用不同的格式或仅限制写访问(例如,对派生类)。
getter 的一个有用应用可以是某种延迟加载:支持字段(被 getter 隐藏的私有字段)初始化为 null。当您要求 getter 返回值时,它会检查 null 并使用更耗时的方法加载值。这只会在第一次调用时发生,之后 getter 将一直提供已经加载的值。
【讨论】:
Getter 和 setter 将接口(getter/setter 函数)与实现(数据的实际存储方式)分开。
【讨论】:
Getter 和 Setter 允许您控制如何访问或更改对象的数据成员。
相比之下,如果您将数据成员直接暴露给对象的用户,则用户可以随意更改它们,而对象甚至不会知道它们已被更改。
不希望人们读取数据成员?将数据成员设为私有,不要编写返回值的 getter。不希望人们修改数据成员?将数据成员设为私有,不要为它编写 setter。想要控制允许值的范围?把它放在 setter 中。
【讨论】:
可能会出现的一个问题是,如果使用方法而不是直接字段访问可能会降低性能。
答案并不是真正的编译器优化代码,因此如果您的方法只执行return field;,其中field 是您使用setter/getter 隐藏的类中的字段,它实际上会直接访问该字段。因此,在大多数情况下,您可以获得相同的性能,同时保留稍后更改 set/get 方法的选项。
Effective Java Programming of Joshua Block 是一本很棒的书,其中包含有关如何编写好代码的技巧,并解释了原因。为什么使用 setter/getter 是提示之一。
注意:您可能会注意到,在某些书籍/文档中,提供 setter/getter 而不是直接访问的字段称为“属性”而不是字段。例如。在 C# 中,您甚至可以指定一个字段是一个属性,并且您不再需要定义 set/get(我认为这是一个不错的功能)。
【讨论】:
公共访问器(getter 和 setter)有时是有意义的。 (我很生气,我不仅要记录类的成员变量,还要记录 2 个几乎没有意义的访问器方法。)
除了 Jason S 提到的情况外,它通常对封装没有帮助。
从数据库加载的一些字符的 java 示例,但应表示为布尔值
char boolFromDb;
public boolean getBoolFromDb() {
return boolFromDb == 'T';
}
public void setBoolFromDb(boolean newValue) {
boolFromDb = newValue ? 'T' : 'F';
}
【讨论】: