Java是一种面向对象的编程语言(它符合纯面向对象的大多数属性),它包括四个OOP支柱(面向对象的编程)概念,即:
抽象化
封装形式
继承
多态性
今天,我将深入探讨称为封装的重要支柱。
作为参考,封装可以定义为“ 将数据和功能绑定到一个单元中,这样就可以保护它们免受外界干扰和滥用。”
因此,让我们首先列出我们想到的问题:
为什么它是重要的支柱?为什么要使用它?
Java必须支持/实现封装的哪些机制?
封装与数据隐藏?
为什么重要?
正如定义所言,要确保不受外界干扰和滥用。让我们以一个复杂的对象为例来理解滥用。
因此,我有一个封装的Employee 类,其中包含员工详细信息(例如id,薪金,部门,项目列表等)和Project类对象,其中包含与项目相关的详细信息(例如id,名称,成本等)作为一个单元。
class Employee
{
String name;
Date age;
Date dateOfJoining;
..
..
List projects;
Double getProjectCost() { ... some implementation ..}
List getGovtProjectNames() { ... some implementation ...}
..
..
}
现在,由于行为是暴露给外部世界的,因此可以这样做:
age = 100; //I am gonna live a long life :Pprojects = new LinkedList<>();
...
..
etc
因此,这很明显是滥用,因为允许外部干扰内部。
我们如何实现封装?
通过将类的成员变量声明为私有,并提供公共的setter / getter方法来修改和查看变量值。
私有成员变量只能在类中使用。只有使用getter方法,才能在类外部访问私有成员。
因此,高于雇员级别的员工应如下所示:
@Data //lomboks way to remove boiler-plate get/setclass Employee
{
private String name;
private Date age;
private Date dateOfJoining;
..
..
private List projects;
public Double getProjectCost()
{ ... some implementation ..}
public List 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:数据隐藏意味着保护类成员免受非法或未经授权的访问。
因此,我们可以说封装通过将变量设为私有,并公开该属性以访问将公开的私有数据,来自动实现数据隐藏的概念,从而为数据提供安全性。
数据隐藏和封装之间的主要区别
封装处理隐藏程序的复杂性。另一方面,数据隐藏处理程序中数据的安全性。
封装着重于包装(封装)复杂数据,以便为用户提供更简单的视图。另一方面,数据隐藏着眼于限制数据的使用,旨在确保数据的安全性。
在封装中,数据可以是公共的或私有的,但是在数据隐藏中,数据必须仅是私有的。
数据隐藏是一种过程以及一种技术,而封装是数据隐藏中的子过程。
结论
最后,我要说的是,数据隐藏和封装都齐头并进,其中数据隐藏着重于数据的安全性,封装着重于降低系统的复杂性,以使应用程序更加用户友好。