通常在 java bean 类中,我们将变量声明为私有的。无论如何,我们将 setter 和 getter 方法声明为公共的。然后我们可以获取和设置属性的值。那么在这里将变量声明为私有有什么用呢?如果我宣布为公开会发生什么?
提前致谢..
通常在 java bean 类中,我们将变量声明为私有的。无论如何,我们将 setter 和 getter 方法声明为公共的。然后我们可以获取和设置属性的值。那么在这里将变量声明为私有有什么用呢?如果我宣布为公开会发生什么?
提前致谢..
这就是封装的目的。
考虑拥有一个age
财产,并且您想对其进行一些控制。如果您将您的字段简单地公开为公共,您可以从外部访问它并使用它做任何您想做的事情。然后,检查年龄是否有效可能会有点麻烦。
话虽如此,例如,使用 setter 方法,您可以拥有一个验证机制。这使您可以控制访问和更改变量的方式和时间。
这同样适用于 getter 方法。想象一下,您有一些不想公开的内部结构,例如,您在内部使用枚举。但是,您不想在课堂外展示这一点。因此,例如,在您的 getter 中,您生成您想要生成的任何值的字符串版本。
您可以在为实例变量设置值之前进行验证,如下所示:
class HeightBean {
private int height;
public int getHeight() {
return height;
}
public void setHeight(int height) {
if(height<0)
height=0;
this.height = height;
}
}
大多数框架使用 bean setter 和 getter 来访问数据。例如,
<jsp:useBean id="name" class="java.lang.String" scope="session">
</jsp:useBean>
<jsp:getProperty property="bytes" name="name"/>
它提供了一个选择。您可能提供也可能不提供 getter 和 setter。
例如,在不可变对象的情况下仅提供 getter 是一种常见的设计选择。
经验法则:尽可能减少能见度。
造成这种情况的主要原因可能是:
限制读写访问和不变性:
如果我想将一个元素设为只读。我会将吸气剂公开并
如果我想在设置值时做任何验证,我只能有一个设置器,使属性可配置和任何验证。
吸气剂可以制作防御性副本。
您可以关联侦听器,以通知 setter 方法中的任何值更改。
如果一个字段依赖于另一个字段,您可以将该逻辑放在 setter 方法中,否则您将始终必须编写一个样板代码来管理它,至少仍然需要一个函数调用。可以将其移至二传手。
但是拥有一个公共属性而不是 setter 和 getter 并没有提供这么多的灵活性。如果不编写额外的函数和调用开销,您将无法执行 1 到 5。