“访问者方法”的定义是什么?

我一直在讨论“访问者”这个词的用法(上下文是Java编程)。 我倾向于认为访问器隐含地是“属性访问器” – 也就是说,该术语暗示它或多或少地提供对对象内部状态的直接访问。 另一方坚持认为任何以任何方式触及对象状态的方法都是访问者。

我知道你们不能为我赢得这个论点,但我很想知道如何定义这个词。 🙂

通过访问者,我倾向于考虑getter和setter。

通过坚持所有触及对象内部状态的方法都是访问器,似乎任何实际使用对象状态的实例方法都是一个访问器,而这似乎并不正确。 什么样的实例方法不会使用对象的状态? 换句话说, 不以某种方式使用对象状态的实例方法不应该是一个开头的实例方法 – 它应该是一个类方法

例如, BigDecimal.add方法应该被视为访问者吗? 这是一个方法,它将读取调用add方法的实例的值,然后在添加另一个BigInteger的值后返回结果。 似乎相当直接的是, add实例方法不是getter也不是setter。

一个访问器方法完全按照它在tin上所说的那样:从没有副作用的类型访问某些状态(除了懒惰的实例化,也许,这不是调用者通常知道的事情)。

 private int _age; public int getAge() { return _age; } 

修改状态的方法更有用(在我看来)作为mutators。

除了谷歌搜索和维基百科之外, Java语言规范还将此作为访问器方法的示例:

 private static int N; public static int getN() { return N; } 

所以,是的,我会说它只是得到一个字段的价值。 编译器可能会将其内联,将其转换为简单的读取,因此除此之外的任何内容都可能不是访问器。

访问器方法: getRed,getGreen和getBlue

这些方法通常访问一个值。

Mutator方法: setRed,setGreen,setBlue

mutator会改变一个值

我总是遵循第一个定义。 所以,通常这只适用于getter和setter。 如果我们采用第二种方法,那么它就是一种远没有那么有用的区别,因为它涵盖了几乎所有的方法。

访问器方法用于访问对象的字段。 所以getter和setter都是访问器方法。 观察者方法是一种方法的正确术语,该方法对对象进行更一般的观察,而不会引起外部可观察到的副作用。 主要目的是引起副作用的方法mutator方法 。 因此,setter是mutator方法的一个例子 。 对于良好的工程实践,应避免使用公共设置器,因为它们使类无法对其数据强制执行不变量:它们违反了类通常应执行的抽象障碍。

能够在技术对话中区分吸气剂和制定者是很好的。 Accessor方法是modifier方法的合作伙伴。 Accessor读取对象的状态( getA() ),而modifier s写入状态( setA(Object) )。

为对象的内部提供访问(可以是“读访问” “写访问”)的方法是“访问器方法”。

这里的作者肯定以这种方式使用它:

  1. http://www.javaworld.com/article/2073723/core-java/why-getter-and-setter-methods-are-evil.html

  2. http://c2.com/cgi/wiki?AccessorsAreEvil

我认为这个术语可能来自Common Lisp(不是所有的东西?) – 用setf来修改访问者插槽的值。