2

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

提前致谢..

4

4 回答 4

9

这就是封装的目的

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

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

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

于 2013-04-23T05:38:56.397 回答
1
  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"/>
    
于 2013-04-23T05:43:16.523 回答
0

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

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

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

于 2013-04-23T05:38:48.650 回答
0

造成这种情况的主要原因可能是:

限制读写访问和不变性:

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

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

  3. 吸气剂可以制作防御性副本。

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

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

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

于 2013-04-23T05:41:43.637 回答