我一直在讨论“访问者”这个词的用法(上下文是Java编程)。我倾向于认为访问器隐含地是“属性访问器” - 也就是说,该术语暗示它或多或少地提供对对象内部状态的直接访问。另一方坚持认为任何以任何方式触及对象状态的方法都是访问者。
我知道你们不能为我赢得这个论点,但我很想知道如何定义这个词。 :)
答案 0 :(得分:16)
通过访问者,我倾向于考虑getter和setter。
通过坚持所有触及对象内部状态的方法都是访问器,似乎任何实际使用对象状态的实例方法都是一个访问器,而这似乎并不正确。什么样的实例方法不会使用对象的状态?换句话说,一个不以某种方式使用对象状态的实例方法不应该是一个开头的实例方法 - 它应该是一个类方法。
例如,BigDecimal.add
方法应该被视为访问者吗?这是一个方法,它将读取调用add
方法的实例的值,然后在添加另一个BigInteger
的值后返回结果。 add
实例方法不是getter也不是setter似乎相当直接。
答案 1 :(得分:8)
一个访问器方法完全按照它在tin上的说法:从没有副作用的类型访问某些状态(除了懒惰的实例化,也许,这不是调用者通常知道的事情)。
private int _age;
public int getAge()
{
return _age;
}
修改状态的方法(在我看来)更有用地被视为mutators。
答案 2 :(得分:3)
除谷歌搜索和维基百科外,Java Language Specification将此作为访问者方法的示例:
private static int N;
public static int getN() { return N; }
所以,是的,我会说它只是得到一个字段的价值。编译器可能会将其内联,将其转换为简单的读取,因此除此之外的任何内容都可能不是访问器。
答案 3 :(得分:3)
访问者方法: getRed,getGreen和getBlue
这些方法通常会访问一个值。
Mutator方法: setRed,setGreen,setBlue
mutator会改变一个值
答案 4 :(得分:1)
我一直都是第一个定义。所以,通常这只适用于getter和setter。如果我们采用第二种方法,那么它就没有那么有用了,因为它涵盖了几乎所有的方法。
答案 5 :(得分:1)
访问器方法用于访问对象的字段。所以getter和setter都是访问器方法。 观察者方法是一种方法的正确术语,它可以对对象进行更一般的观察,而不会导致外部可观察到的副作用。主要目的是引起副作用的方法是 mutator方法。因此,setter是mutator方法的示例。对于良好的工程实践,应避免使用公共设置器,因为它们使类无法对其数据强制执行不变量:它们违反了类通常应执行的抽象障碍。
答案 6 :(得分:0)
能够在技术对话中区分吸气剂和制定者是件好事。 Accessor
方法是modifier
方法的合作伙伴。 Accessor
读取对象的状态(getA()
),而modifier
写入状态(setA(Object)
)。
答案 7 :(得分:0)
为对象内部提供访问权限(可以是“读取访问权限”或“写入访问权限”)的方法是“访问者方法”。
这里的作者肯定以这种方式使用它:
http://www.javaworld.com/article/2073723/core-java/why-getter-and-setter-methods-are-evil.html
我认为这个术语可能来自Common Lisp(并非一切?) - 用setf来修改访问者插槽的值。