15

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

我知道你们不能为我赢得争论,但我很想知道你会如何定义这个词。:)

4

8 回答 8

16

对于访问器,我倾向于想到 getter 和 setter。

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

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

于 2009-03-08T14:09:34.530 回答
9

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

private int _age;

public int getAge()
{
    return _age;
}

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

于 2009-03-08T14:07:14.427 回答
4

访问器方法: getRed、getGreen 和 getBlue

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

突变方法: setRed、setGreen、setBlue

一个 mutator 将改变一个值

于 2013-04-24T22:05:00.627 回答
3

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

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

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

于 2009-03-08T14:11:07.647 回答
1

我总是按照第一个定义。因此,通常这仅适用于 getter 和 setter。如果我们采用第二种方法,那么它的区别就小得多了,因为它几乎涵盖了所有方法。

于 2009-03-08T14:06:26.427 回答
1

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

于 2014-10-16T02:07:56.217 回答
0

能够在技术对话中区分 getter 和 setter 是件好事。 Accessor方法是方法的伙伴modifierAccessors 读取对象的状态 ( getA()),而modifiers 写入状态 ( setA(Object))。

于 2009-07-08T00:48:04.967 回答
0

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

这里的作者当然以这种方式使用它:

  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 用于修改访问器插槽的值。

于 2015-06-16T01:17:44.993 回答