19

如果您有一个具有一些普通 get/set 属性的类,是否有任何理由在类方法中使用 getter,或者您应该只使用私有成员变量?我认为关于setter(验证逻辑?)可能会有更多争论,但我想知道getter。

例如(在 Java 中)- 是否有任何理由使用选项 2?:

public class Something
{
    private int messageId;
    public int getMessageId() { return this.messageId; }
    public void setMessage(int messageId) { this.messageId = messageId; }

    public void doSomething()
    {
        // Option 1:
        doSomethingWithMessageId(messageId);

        // Option 2:
        doSomethingWithMessageId(getMessageId());
    }
}
4

6 回答 6

9

一般来说,Java 程序员在使用 getter 方法方面往往非常一致。我对多种语言进行编程,但对此并不一致;)

我会说,只要您制作吸气剂,就可以使用原始变量 - 用于私有变量。当你制作一个吸气剂时,你应该只使用它。当我为私有字段创建 getter 时,我的 IDE 建议它在我引入 getter 时自动为我替换原始字段访问。切换到使用 getter 只需几次击键(并且没有任何引入错误的机会),所以我倾向于延迟它直到我需要它。

当然,如果你想要 getter-injection 之类的东西,某些类型的代理和子类化框架,如 hibernate,你必须使用 getter!

于 2009-03-10T06:01:50.833 回答
7

使用 getter,您不会意外修改变量 :) 此外,如果您同时使用 getter 和“原始”变量,您的代码可能会混淆。

此外,如果您使用继承并在子类中重新定义 getter 方法,则使用 getter 的方法将正常工作,而使用原始变量的方法则不会。

于 2009-03-10T05:35:44.780 回答
3

如果您在任何地方都使用 getter 方法 - 并且将来对 getMessageId() 的所有调用执行代码搜索,您会找到所有这些方法,而如果您使用了私有方法,您可能会错过一些。

此外,如果在 setter 方法中引入了逻辑,您不必担心为它更改超过 1 个位置。

于 2009-03-10T05:38:38.453 回答
1

如果您分配给属性的值是已知的或经过验证的值,您可以安全地直接使用私有变量。(也许在某些特殊情况下,很明显为什么会不好。)您是否这样做更多的是品味或风格问题。这也不是性能问题,因为如果 getter 或 setter 足够简单,编译器将内联它。

如果类不知道该值,则应使用该属性对其进行设置,这样您就可以保护该属性免受非法值的影响。

这是一个示例(在 C# 中):

public class Something {

   private string _value;

   public string Value {
      get {
         return _value;
      }
      set {
         if (value == null) throw new ArgumentNullException();
         _value = value;
      }
   }

   public Something() {
      // using a known value
      _value = "undefined";
   }

   public Something(string initValue) {
      // using an unknown value
      Value = initValue;
   }

}
于 2009-03-10T07:20:32.517 回答
0

如果您使用 getter,您将确保在对其应用任何逻辑/决策后获得该值。这可能不是您的典型情况,但如果是这样,您会为此感谢自己。

于 2009-03-10T07:23:37.080 回答
0

除非我有一个特定的用例可以直接在封闭类中使用内部字段,否则我一直认为以与公开访问相同的方式访问该字段很重要。如果需要通过 getter 方法或属性向字段添加一些后处理,这可以确保全面的返回值的一致性。如果您出于某种原因想要原始值,我觉得访问原始字段非常好。

通常情况下,getter 封装是简单的样板代码——除了字段值本身,您很可能不会返回任何内容。但是,如果您可能希望在未来某个时间点更改数据的呈现方式,那么您必须在内部进行的重构就更少了。

于 2020-01-19T18:46:33.140 回答