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