【问题标题】:why we are declaring variables as private in java [duplicate]为什么我们在java中将变量声明为私有[重复]
【发布时间】:2013-04-16 05:12:55
【问题描述】:

通常在 java bean 类中,我们将变量声明为私有的。无论如何,我们将 setter 和 getter 方法声明为公共的。然后我们就可以获取和设置属性的值了。那么在这里将变量声明为私有有什么用呢?如果我声明为 public 会发生什么?

提前谢谢..

【问题讨论】:

  • 谁说 getter 和 setter 是好的? javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html
  • 检查封装。基本目的是保护数据。
  • 这是一个基于Encapsulation 的概念,其中对象提供与数据交互的方法。它可以防止修改对象正在管理的数据
  • 请在投反对票前给出正当理由.please
  • 如果你保持你的变量公开。其他类可以直接改变值或读取值。使用变量 private 和 Setter 和 Getter 访问它允许您在更改数据之前验证新值..希望它有意义

标签: java private encapsulation public


【解决方案1】:

它提供了一个选择。您可能提供也可能不提供 getter 和 setter。

例如,在不可变对象的情况下仅提供 getter 是一种常见的设计选择。

经验法则:尽可能减少可见度。

【讨论】:

    【解决方案2】:

    这就是encapsualtion的目的。

    考虑拥有一个age 属性,并且您希望对其进行一些控制。如果您将您的字段简单地公开为公共,您可以从外部访问它并使用它做任何您想做的事情。然后,检查年龄是否有效可能有点麻烦。

    话虽如此,例如,使用 setter 方法,您可以设置验证机制。这使您可以控制访问和更改变量的方式和时间。

    这同样适用于 getter 方法。想象一下,您有一些不想公开的内部结构,例如,您在内部使用枚举。但是,您不想在课堂外展示这一点。因此,例如,在你的 getter 中,你产生你想要产生的任何值的字符串版本。

    【讨论】:

    • +1 也考虑让年龄从 Date 值计算,而不是 age 的属性是从内部状态推断出来的......作为一个可能的例子;)
    • @npinti 感谢您的帮助
    • @samba:不客气。 MadProgrammer 的例子也很有效,实现也比较现实。
    【解决方案3】:

    主要原因可能是:

    限制读写访问和不变性:

    1. 如果我想将一个元素设为只读。我会将 getter 公开并

    2. 我只能有一个设置器,如果我想在设置值时进行任何验证,可以使属性可配置和任何验证。

    3. getter 可以制作防御性副本。

    4. 您可以关联侦听器,以通知 setter 方法中的任何值更改。

    5. 如果一个字段依赖于另一个字段,您可以将该逻辑放在 setter 方法中,否则您将始终需要编写一个样板代码来管理它,至少仍然需要一个函数调用。可以将其移至 setter。

    但是使用公共属性而不是 setter 和 getter 并不能提供这么多的灵活性。如果不编写额外的函数和调用开销,您将无法执行 1 到 5。

    【讨论】:

      【解决方案4】:
      1. 您可以在为实例变量设置值之前进行验证,如下所示:

        class HeightBean {
        
          private int height;
          public int getHeight() {
           return height;
          }
          public void setHeight(int height) {
          if(height<0)
              height=0;
          this.height = height;
          }
        }
        
      2. 大部分框架使用 bean setter 和 getter 来访问数据。例如,

          <jsp:useBean id="name" class="java.lang.String" scope="session">
          </jsp:useBean>
          <jsp:getProperty property="bytes" name="name"/>
        

      【讨论】:

        猜你喜欢
        • 2021-12-21
        • 1970-01-01
        • 2017-04-11
        • 2017-08-04
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 2015-05-02
        相关资源
        最近更新 更多