【发布时间】:2009-03-08 14:02:56
【问题描述】:
我一直在争论“访问器”一词的用法(上下文是 Java 编程)。我倾向于将访问器视为隐含的“属性访问器”——也就是说,该术语暗示它或多或少地提供对对象内部状态的直接访问。对方坚持任何以任何方式接触到对象状态的方法都是访问器。
我知道你们无法为我赢得争论,但我很想知道你们如何定义这个词。 :)
【问题讨论】:
标签: java definition accessor
我一直在争论“访问器”一词的用法(上下文是 Java 编程)。我倾向于将访问器视为隐含的“属性访问器”——也就是说,该术语暗示它或多或少地提供对对象内部状态的直接访问。对方坚持任何以任何方式接触到对象状态的方法都是访问器。
我知道你们无法为我赢得争论,但我很想知道你们如何定义这个词。 :)
【问题讨论】:
标签: java definition accessor
对于访问器,我倾向于想到 getter 和 setter。
通过坚持所有触及对象内部状态的方法都是访问器,似乎任何实际使用对象状态的实例方法都是访问器,而这似乎并不正确。什么样的实例方法不会使用对象的状态?换句话说,一个不以某种方式使用对象状态的实例方法不应该是一个实例方法——它应该是一个类方法。
例如,BigDecimal.add 方法是否应该被视为访问器?它是一种读取调用add 方法的实例的值,然后在添加另一个BigInteger 的值后返回结果的方法。 add 实例方法既不是 getter 也不是 setter,这似乎相当直截了当。
【讨论】:
访问器方法完全按照它在 tin 上所说的:从类型中访问某些状态而没有副作用(也许除了延迟实例化,这不是调用者通常知道的事情)。
private int _age;
public int getAge()
{
return _age;
}
修改状态的方法更有用(在我看来)被视为 mutators。
【讨论】:
访问器方法: getRed、getGreen 和 getBlue
这些方法通常访问一个值。
Mutator 方法: setRed、setGreen、setBlue
一个mutator会改变一个值
【讨论】:
除了谷歌搜索和维基百科之外,Java Language Specification 将此作为访问器方法的示例:
private static int N;
public static int getN() { return N; }
所以,是的,我会说它只是获取一个字段的值。编译器可能会内联它,将其转换为简单的读取,因此除此之外的任何东西都可能不是访问器。
【讨论】:
我一直遵循第一个定义。因此,通常这仅适用于 getter 和 setter。如果我们采用第二种方法,那么它的区别就小得多了,因为它几乎涵盖了所有方法。
【讨论】:
访问器方法用于访问对象的字段。所以 getter 和 setter 都是访问器方法。 观察者方法 是对一个对象进行更一般的观察而不引起外部可观察的副作用的方法的正确术语。主要目的是引起副作用的方法是mutator 方法。因此,setter 是 mutator 方法的一个示例。对于良好的工程实践,应避免使用公共 setter,因为它们使类无法对其数据强制执行不变量:它们违反了类通常应强制执行的抽象障碍。
【讨论】:
能够在技术对话中区分 getter 和 setter 是件好事。 Accessor 方法是 modifier 方法的伙伴。 Accessors 读取对象的状态 (getA()),而 modifiers 写入状态 (setA(Object))。
【讨论】:
提供对对象内部的访问(可以是“读访问”或“写访问”)的方法是“访问器方法”。
这里的作者肯定是以这种方式使用它的:
我认为该术语可能源自 Common Lisp(不是所有内容吗?) -- setf 用于修改访问器插槽的值。
【讨论】: