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