【问题标题】:What is the definition of "accessor method"?“访问器方法”的定义是什么?
【发布时间】:2009-03-08 14:02:56
【问题描述】:

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

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

【问题讨论】:

    标签: java definition accessor


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我同意这一点。突变器改变状态,访问器检查状态。我会说访问器一词也适用于对象的派生属性。毕竟,即使是派生属性也反映了对象的状态。
      【解决方案3】:

      访问器方法: getRed、getGreen 和 getBlue

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

      Mutator 方法: setRed、setGreen、setBlue

      一个mutator会改变一个值

      【讨论】:

      • 我会更加谨慎地表述这一点:mutator 会修改实例的状态。或者更加谨慎:mutator 修改实例的可观察状态。 (-> 抽象数据类型)
      【解决方案4】:

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

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

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

      【讨论】:

      • 这不是一个决定性的论点。仅仅因为规范给出了这个例子并不意味着访问器方法也不是其他东西。
      【解决方案5】:

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

      【讨论】:

      • 正是我争论这个案子的原因。 :)
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 我知道——而且在当时——访问器和修改器之间的区别。当这是一个当前的问题时,争论的另一方提到了芬兰大学讲师的一本 Java 书。该书将访问器定义为以任何方式接触对象状态的任何方法。我认为这是对该术语的误译或误解,并试图在此验证我的观点。 :)
        【解决方案8】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-26
          • 1970-01-01
          • 2017-12-11
          • 2011-01-09
          相关资源
          最近更新 更多