为什么 Java 中的实例变量始终是私有的?

2022-09-01 16:37:37

我是Java的新手,我正在学习封装,并看到了一个示例,其中实例变量在类中被声明为私有。

http://www.tutorialspoint.com/java/java_encapsulation.htm

我有2个查询:

  1. 为什么实例变量是私有的?为什么不公开?
  2. 如果实例变量公开并直接访问,该怎么办?我们是否看到任何限制?

您能用一个例子来解释一下,如果实例变量在Java中的类中被声明为公共,会有什么问题吗?


答案 1

实例变量被设为私有,以强制这些类的用户使用方法来访问它们。在大多数情况下,有普通的 getter 和 setter,但也可以使用其他方法。

例如,使用方法将允许您将访问限制为只读,即如果没有 setter,则字段可能被读取但未写入。如果该领域是公开的,这是不可能的。

此外,您可以为字段访问添加一些检查或转换,而这对于公共字段的普通访问是不可能的。如果一个字段是公共的,并且您以后希望通过执行其他检查等的某种方法来强制所有访问。您必须更改该字段的所有用法。如果将其设为私有,则稍后只需更改访问方法即可。

如果电话是私人的:

请考虑以下情况:

class Address {
  private String phone;

  public void setPhone(String phone) {
    this.phone = phone;
  }
}

//access:
Address a = new Address();
a.setPhone("001-555-12345");

如果我们从这样的类开始,后来需要对电话号码执行检查(例如,一些最小长度,仅数字等),您只需要更改设置符:

class Address {
  private String phone;

  public void setPhone(String phone) {
    if( !isValid( phone) ) { //the checks are performed in the isValid(...) method
     throw new IllegalArgumentException("please set a valid phone number");
    }

    this.phone = phone;
  }
}

//access:
Address a = new Address();
a.setPhone("001-555-12345"); //access is the same

如果电话是公开的:

有人可以这样设置,而你对此无能为力:phone

Address a = new Address();
a.phone="001-555-12345";

如果您现在想要强制执行验证检查,则必须将其设为私有,并且编写上述行的人都必须将第二行更改为:

a.setPhone("001-555-12345");

因此,您不能在不破坏其他代码的情况下添加检查(它不再编译)。

此外,如果通过方法访问类的所有字段/属性,则可以保持访问一致性,用户不必担心属性是存储的(即是实例字段)还是计算的(只有方法而没有实例字段)。


答案 2

他们不必是私人的 - 但他们应该是。字段是实现细节 - 因此应将其保密。如果你想允许用户获取或设置其值,你可以使用属性来执行此操作(get和set方法) - 这可以让你安全地做到这一点(例如验证输入),还允许您更改实现细节(例如,将一些值委托给其他对象等),而不会失去向后兼容性。


推荐