封装就是维护一个separation of concerns,其核心思想是一个类应该尽可能少地了解其他类是如何工作的,部分原因是您可以对这些类进行更改而不必更改其他类与他们互动。
概括地说:根据经验,您希望您的每个班级都做“自己的小事”——拥有自己的小关注,以及进入的所有逻辑 在该类的私有方法中封装这件小事。如果其他类在做他们自己的小事情的过程中需要从第一个类中了解事情,那么您在该类中提供 getter 方法来公开这些事情而不暴露它们的详细信息内部实施。
关于您的具体问题,您提到的选项实际上是同一件事:getter 是一种被其他类调用以返回字段值的方法。这种方法的优点是它封装包含它的类中的字段,然后它可以解析/重新计算/存储或以其他方式与该字段交互,只要它是@987654323 @ 返回预期的数据类型。
为了说明,假设您创建了一个带有double balance 字段的BankAccount 类。你做了一些测试,它似乎工作正常,所以你创建了几个引用这个balance 字段的其他类。在某些时候,您会注意到您的一些计算结果降低了几美分。您做了一些研究,发现使用double 来存储货币值是一种不好的做法,您应该改用一个名为BigDecimal 的类。
如果您的其他类直接访问了您的 balance 字段,则它们都必须进行更改(并且所有人都必须导入 BigDecimal,即使他们从未直接使用它)以促进这种更改。另一方面,如果他们通过getter方法访问帐户的balance,您可以在BankAccount中将balance的类型更改为BigDecimal
在将getBalance() 的返回类型保留为double 的同时,通过调用BigDecimal 的toDouble() 方法返回您其他类期望的double 值:您的其他类都不会知道您已经更改了数据类型。
另一种表述关注点分离概念的方式是说每个类都应该有一个改变的理由(这是@GregKopff 的评论中引用的single responsibility principle):需要改变balance 字段的数据类型是 BankAccount 更改的正当理由,但它是正当理由还是与它交互的所有其他类都发生了变化?您是否必须因为 Account 类中的技术细节发生更改而更改您的 BankAccountHolder 或 BankEmployee 类?
这似乎不能直接回答你的问题,但我认为这个问题的唯一答案一般来说是为了说明你应该问你自己来回答它的问题每次你遇到它......几乎每次你写一堂课都会发生这种情况。
如果我的插图不清楚,请告诉我如何澄清:您提出了一个重要问题,重要的是您要掌握答案(以及您要问的内容)。