【问题标题】:Explain to me what is a setter and getter向我解释什么是 setter 和 getter
【发布时间】:2011-02-08 14:19:57
【问题描述】:

什么是setter和getter?为什么我需要它们?以有效方式使用它们的一个很好的例子是什么? setter 和 getter 的意义何在?

更新: 请给我一些编码示例吗?

【问题讨论】:

标签: oop


【解决方案1】:

getter 是一种获取属性值的方法。 setter 是一种设置属性值的方法。关于它们的功效存在一些争论,但要点大致是:

  • 为了封装的完整性

  • 在内部细节发生变化时保持界面一致

当您需要围绕获取或设置添加一些逻辑时更有用,例如在编写值之前对其进行验证。

【讨论】:

    【解决方案2】:

    getter/setter 用于隐藏私有字段不被公开(您可以避免直接访问字段)。

    getter 允许您在内部字段中使用提供的值之前对其进行检查。例如,setter 允许您应用不同的格式或仅限制写访问(例如,对派生类)。

    getter 的一个有用应用可以是某种延迟加载:支持字段(被 getter 隐藏的私有字段)初始化为 null。当您要求 getter 返回值时,它会检查 null 并使用更耗时的方法加载值。这只会在第一次调用时发生,之后 getter 将一直提供已经加载的值。

    【讨论】:

      【解决方案3】:

      Getter 和 setter 将接口(getter/setter 函数)与实现(数据的实际存储方式)分开。

      【讨论】:

        【解决方案4】:

        Getter 和 Setter 允许您控制如何访问或更改对象的数据成员。

        相比之下,如果您将数据成员直接暴露给对象的用户,则用户可以随意更改它们,而对象甚至不会知道它们已被更改。

        不希望人们读取数据成员?将数据成员设为私有,不要编写返回值的 getter。不希望人们修改数据成员?将数据成员设为私有,不要为它编写 setter。想要控制允许值的范围?把它放在 setter 中。

        【讨论】:

          【解决方案5】:

          可能会出现的一个问题是,如果使用方法而不是直接字段访问可能会降低性能。 答案并不是真正的编译器优化代码,因此如果您的方法只执行return field;,其中field 是您使用setter/getter 隐藏的类中的字段,它实际上会直接访问该字段。因此,在大多数情况下,您可以获得相同的性能,同时保留稍后更改 set/get 方法的选项。

          Effective Java Programming of Joshua Block 是一本很棒的书,其中包含有关如何编写好代码的技巧,并解释了原因。为什么使用 setter/getter 是提示之一。

          注意:您可能会注意到,在某些书籍/文档中,提供 setter/getter 而不是直接访问的字段称为“属性”而不是字段。例如。在 C# 中,您甚至可以指定一个字段是一个属性,并且您不再需要定义 set/get(我认为这是一个不错的功能)。

          【讨论】:

            【解决方案6】:

            公共访问器(getter 和 setter)有时是有意义的。 (我很生气,我不仅要记录类的成员变量,还要记录 2 个几乎没有意义的访问器方法。)

            除了 Jason S 提到的情况外,它通常对封装没有帮助。

            从数据库加载的一些字符的 java 示例,但应表示为布尔值

            char boolFromDb;
            
            public boolean getBoolFromDb() {
                return boolFromDb == 'T';
            }
            
            public void setBoolFromDb(boolean newValue) {
                boolFromDb = newValue ? 'T' : 'F';
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-05-21
              • 2014-12-20
              • 2018-12-08
              • 2015-03-29
              • 1970-01-01
              • 2012-05-12
              • 2011-02-07
              相关资源
              最近更新 更多