为什么要使用封装? - Vaibhav Singh


Java是一种面向对象的编程语言(它符合纯面向对象的大多数属性),它包括四个OOP支柱(面向对象的编程)概念,即:

  • 抽象化
  • 封装形式
  • 继承
  • 多态性

今天,我将深入探讨称为封装的重要支柱。
作为参考,封装可以定义为“ 将数据和功能绑定到一个单元中,这样就可以保护它们免受外界干扰和滥用。”
因此,让我们首先列出我们想到的问题:
为什么它是重要的支柱?为什么要使用它?
Java必须支持/实现封装的哪些机制?
封装与数据隐藏?

为什么重要?
正如定义所言,要确保不受外界干扰和滥用。让我们以一个复杂的对象为例来理解滥用。
因此,我有一个封装的Employee 类,其中包含员工详细信息(例如id,薪金,部门,项目列表等)和Project类对象,其中包含与项目相关的详细信息(例如id,名称,成本等)作为一个单元。

class Employee 
{
  String name;
  Date age;
  Date dateOfJoining;
  .. 
  .. 
  List<Project> projects;
  Double getProjectCost() { ... some implementation ..}
  List<String>  getGovtProjectNames() { ... some implementation ...}
  ..
  ..
}

现在,由于行为是暴露给外部世界的,因此可以这样做:

age = 100; //I am gonna live a long life :P
projects = new LinkedList<>();
...
..
etc

因此,这很明显是滥用,因为允许外部干扰内部。

我们如何实现封装?
通过将类的成员变量声明为私有,并提供公共的setter / getter方法来修改和查看变量值。
私有成员变量只能在类中使用。只有使用getter方法,才能在类外部访问私有成员。
因此,高于雇员级别的员工应如下所示:

@Data //lomboks way to remove boiler-plate get/set
class Employee 
{
  private String name;
  private Date age;
  private Date dateOfJoining;
  .. 
  .. 
  private List<Project> projects;
  public Double getProjectCost() 
  { ... some implementation ..}
  public List<String>  getGovtProjectNames() 
  { ... some implementation ...}
  ..
  ..
}

为什么要使用封装?
  • 灵活性:通过新的要求集更改封装的代码更加灵活和容易。例如,如果添加/删除员工项目的要求发生变化,我们可以轻松地更新setter方法()或提供的方法中的逻辑。
  • 可重用性:封装的代码可以在整个应用程序中或在多个应用程序中重用。
  • 可维护性:将应用程序代码封装在单独的单元(类,接口,方法,getter / setter等)中时,可以轻松更改或更新应用程序的一部分而不会影响其他部分,从而减少了开发人员的工作量和时间。
  • 可测试性:对于封装类,编写单元测试更加容易,因为成员变量不会分散在各处,从而也减少了测试人员的时间和精力。
  • 数据隐藏:方法的调用者对类的内部逻辑一无所知,因为调用者函数看不到成员变量。调用方仅知道要传递给setter方法(或任何方法)以使用该值进行初始化的参数。例如

public void setAge(int age) 
{
 if (age < 18 || age > 55) 
 {
  throw IllegalArgumentException("Age must be from 18 to 55");
 }
 this.age = age;
}

封装与数据隐藏?
首先定义数据隐藏DataHiding:数据隐藏意味着保护类成员免受非法或未经授权的访问。
因此,我们可以说封装 通过将变量设为私有,并公开该属性以访问将公开的私有数据,来自动实现数据隐藏的概念,从而为数据提供安全性。
数据隐藏和封装之间的主要区别

  1. 封装处理隐藏程序的复杂性。另一方面,数据隐藏处理程序中数据的安全性。
  2. 封装着重于包装(封装)复杂数据,以便为用户提供更简单的视图。另一方面,数据隐藏着眼于限制数据的使用,旨在确保数据的安全性。
  3. 在封装中,数据可以是公共的或私有的,但是在数据隐藏中,数据必须仅是私有的。
  4. 数据隐藏是一种过程以及一种技术,而封装是数据隐藏中的子过程。

结论
最后,我要说的是,数据隐藏和封装都齐头并进,其中数据隐藏着重于数据的安全性,封装着重于降低系统的复杂性,以使应用程序更加用户友好。