【问题标题】:Necessity of getter methods [duplicate]getter方法的必要性[重复]
【发布时间】:2012-08-06 16:20:23
【问题描述】:

可能重复:
Why use getters and setters?

这是一个新手问题。是否非常有必要使用 getmethods 来访问属性值?一旦分配了值,就可以获取值目录。例如,在下面的代码中,displayName() 可以在没有任何 getter 方法的帮助下显示 firstName 值。或者它是一个标准的编码标准,必须具有 getter 和 setter 方法或任何其他赋予该值的方法?

class Test{

    private String firstName;

    public void setName(String fname){
        firstName = fname;
    }

    public void displayName() {
        System.out.println("Your name is " + firstName);
    }
}          

【问题讨论】:

    标签: java


    【解决方案1】:

    始终使用 Getter 和 Setter 来访问您的属性!

    你应该看看this article...

    【讨论】:

    • 即使在包私有类和嵌套类的情况下?
    • 如果您想从类中访问该字段,这是否也适用(就像他在这个例子中一样)?我不这么认为......这篇文章只讨论了外部访问和公共字段的替代使用(我同意应该保持在最低限度)。
    【解决方案2】:

    在您的情况下(显示显示名称),无需提供 Getter。

    但是如果你想在另一个类中使用该字段我们需要提供Getter方法。

    【讨论】:

      【解决方案3】:

      Tell, Don't Ask 是面向对象设计中的一个重要原则。一般来说,你应该告诉对象做事而不是问他们问题。每个地方的 getter/setter 都不鼓励这种做法,因为鼓励您进入对象内部并到达字段(或者更糟糕的是,在 setter 的情况下伸入并戳东西)。这会破坏封装并使您的代码更难推理。

      在您的特定情况下,我将创建一个名为 Name 的对象,该对象具有一个使用名称和单个方法来显示它的构造函数。

      【讨论】:

        【解决方案4】:

        Getter 和 setter 是 Java Bean 标准接口的一部分,许多框架(如 Hibernate)都希望它们到位。话虽这么说,当然由您决定是否需要它们以及何时需要它们以及用于什么目的。它们提供对您的私有成员变量的访问,它们甚至可以让您有机会做更多的事情,而不仅仅是简单的 get 和 set。

        OO 软件的重点是重用。这意味着其他程序员,或者多年后的您,可以将代码用于其他系统。

        当您拥有私有成员变量并使用 get/set 函数时,您可以更改函数的内部实现,而不会破坏使用它的所有其他代码。

        【讨论】:

          【解决方案5】:

          拥有私有状态,封装是好的,在很多情况下这是正确的。假设您的类是线程安全的,具有您无法确保的公共字段。

          另一方面,在某些情况下这是无用的!假设你只在一个包中访问你的对象,你确定你永远不会导出它,那何必呢?

          【讨论】:

          • 很确定您可以使用volatile 关键字。
          • @Woot4Moo 使用 volatile 唯一要确保的就是可见性,这对于线程安全来说是不够的
          • @Woot4Moo 但你不能做任何复合..
          【解决方案6】:

          我没有任何链接来支持这一点,但这就是我所做的。

          如果公共字段不是静态的,我会尽量避免它们。所以我只使用受保护和私有字段。在课堂上,您无需获取/设置即可访问它们,这完全没问题。在课堂之外,请始终尝试使用 get/set。

          所以你的示例代码对我来说完全没问题。 :)

          编辑:对我来说,一个例外是如果我创建一个类似 struct 的容器类,像这样

          class Point4D {
            public int x1, x2, x3, x4;
          }
          

          那我认为公共领域是可以的。不过,最好将它们设为私有并将 getter 命名为 public int x1() 等。一旦向这个容器引入了一些改变实例的状态的方法(比如改变 x1/x2/x3/x4 的值),我将它们设为私有并添加 get/set。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-11-19
            • 1970-01-01
            • 2019-04-12
            • 2013-08-28
            • 1970-01-01
            • 2014-09-06
            • 2023-03-09
            相关资源
            最近更新 更多