【问题标题】:Using getters within class methods在类方法中使用 getter
【发布时间】:2009-03-10 05:32:32
【问题描述】:

如果您有一个具有一些普通 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());
    }
}

【问题讨论】:

标签: getter


【解决方案1】:

Java 程序员通常倾向于非常一致地使用 getter 方法。我对多种语言进行了编程,但我对此并不一致;)

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

当然,如果你想要像 getter 注入、某些类型的代理和子类化框架(如 hibernate),你必须使用 getter!

【讨论】:

  • 使用 getter 时 JRE 的性能有什么不同吗?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      如果您分配给属性的值是已知的或经过验证的值,您可以安全地直接使用私有变量。 (也许在某些特殊情况下,很明显为什么会不好。)您是否这样做更多的是品味或风格问题。这也不是性能问题,因为如果 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;
         }
      
      }
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-05-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-03
            • 1970-01-01
            • 2011-06-13
            • 2014-09-24
            相关资源
            最近更新 更多