一、简介

我们想把今天的课用在封装上。您已经大致了解它是什么。

封装

封装有什么好处?它们有很多,但我可以挑出四个,在我看来,它们是主要的:


2.有效的内部状态

在程序中,当一个对象与其他几个类交互时,经常会出现这种情况。这些与对象的交互会破坏对象内部的数据,使对象无法继续按预期工作。

因此,对象需要跟踪对其内部数据的任何更改,或者更好的是,自己进行更改。

如果我们不希望某些变量被其他类更改,那么我们将其声明为私有的。一旦我们这样做了,只有它自己的类的方法才能访问它。如果我们希望变量是只读的,那么我们需要public getter为相关变量添加一个。

例如,假设我们希望每个人都能够知道我们集合中元素的数量,但我们不希望他们能够在未经我们许可的情况下更改集合。然后我们声明一个private int count变量和一个public getCount()方法。

正确使用封装可确保没有类可以直接访问我们类的内部数据,从而防止任何超出我们控制范围的更改。这些更改只能通过调用与正在更改的变量相同的类的方法来实现。

最好假设其他程序员将始终以对他们最方便的方式使用您的类,而不是对您(对您的类)最安全的方式。这种行为是这两个错误的来源,也是防止它们的尝试。


3. 验证方法参数

有时我们需要验证传递给我们方法的参数。例如,假设我们有一个类代表一个人并让您设置生日。我们必须检查所有输入数据,以确保它符合程序逻辑和我们类的逻辑。例如,不允许生日在第 13 个月或 2 月 30 日,等等。

为什么有人会在出生日期上注明 2 月 30 日?首先,这可能是输入数据时的用户错误。其次,程序在开始像发条一样运行之前可能有很多错误。例如,可能出现以下情况。

一个程序员编写了一个程序来识别生日是后天的人。例如,假设今天是 3 月 3 日。程序将数字 2 添加到该月的当前日期,并查找所有 3 月 5 日出生的人。似乎一切都是正确的。

但是当 3 月 30 日到来时,程序将找不到任何人,因为日历没有 3 月 32 日。如果我们检查传递给方法的数据,程序的错误就会少得多。

还记得我们研究ArrayList和分析它的代码吗?我们看到andget方法set检查是否index大于或等于零且小于数组的长度。 更重要的是,如果索引落在数组的边界之外,这些方法会抛出异常。 这是输入验证的经典示例。


4. 更改代码时尽量减少错误

假设我们在参与一个大型项目时写了一个超级有用的类。每个人都非常喜欢它,以至于其他程序员开始在他们的代码中的数百个地方使用它。

该课程非常有用,您决定对其进行一些改进。但是如果你从类中删除任何方法,那么几十个人的代码将停止编译。他们将不得不重写一切。你做的改变越多,你就会犯越多的错误。你会破坏很多集会,你会被讨厌。

但是当我们更改声明为私有的方法时,我们知道在任何地方都没有任何其他类可以调用这些方法。我们可以重写它们,改变参数的数量和类型,任何依赖的外部代码都将继续工作。好吧,至少它会编译。


5.我们决定我们的对象如何与外部对象交互

我们可以限制一些可以用我们的对象执行的操作。例如,假设我们希望一个对象只被实例化一次。即使它可能在项目中的多个地方创建。由于封装,我们可以做到这一点。

封装2

封装让我们可以添加额外的限制,这可以转化为额外的优势。例如,该类String被实现为不可变对象。类的对象String从创建的那一刻到死亡的那一刻是不可变的。该类的所有方法String( remove, substring, ...) 都返回一个新字符串,而不对调用它们的对象做任何更改。

封装是一件很有意思的事情。