返回并打印字段值或仅通过类方法打印值?

5 java oop getter encapsulation single-responsibility-principle

我目前正在学习Java并学习封装,我不确定以下哪项是更好的做法:

  1. 使用getter将字段值从一个类返回到另一个类,然后通过另一个类中的方法打印它.
  2. 从另一个类调用类中的方法以打印字段的值.

该值不会被操纵,只能通过System.out.println()显示;

任何意见,将不胜感激 :)

编辑:一个类(人)持有关于人的信息,例如姓名,年龄,体重等,另一个类(目录)具有用于搜索人的LinkedList以找到具有匹配年龄的对象的方法.如果找到某人,则该方法打印出该人的姓名.

dre*_*ore 5

封装是关于维护关注点分离,其核心思想是一个类应该尽可能少地了解其他类的工作方式,部分是因为您可以对这些类进行更改而无需更改与之交互的其他类.他们.

广:作为一个经验法则,你希望每个班做"它自己的小东西" -有其自己的小的关注,与所有进入逻辑的是小东西封装在类的私有方法.如果其他类在做自己的小事情的过程中需要从第一个类知道事物,那么你在该类中提供暴露这些事物的getter方法,而不暴露它们在内部实现的细节.

特别是关于你的问题,你提到的选项实际上是同一个东西:getter 一个被其他类调用以返回字段值的方法.这种方法的优点是它将该字段封装在包含它的类中,然后可以解析/重新计算/存储或以其他方式与该字段交互,但只要它getter返回预期的数据类型,它就会喜欢.

为了说明,假设您创建了一个BankAccount带有double balance字段的类.你做了一些测试,似乎工作正常,所以你创建了几个引用这个balance字段的其他类.在某些时候,你会注意到你的一些计算结果只有几美分.你做了一些研究,发现double用来存储货币价值是不好的做法,你应该使用一个叫做的类BigDecimal.

如果你的其他类balance直接访问你的字段,它们都必须改变(BigDecimal即使它们从不直接使用它们也必须导入)以便促进这种改变.在另一方面,如果他们访问帐户的balance一个getter方法的方式,你可以改变的类型balanceBigDecimalBankAccount 而留下的返回类型getBalance()double,通过调用BigDecimaltoDouble()方法返回double值的其他类期望:没有你其他类将知道您已更改数据类型.

说明关注点分离的另一种方式是说每个类应该有一个改变的理由(这是@ GregKopff评论中引用的单一责任原则):需要改变balance字段的数据类型是一个正当理由为BankAccount改变,但是这将是一个有效的理由或所有与它交互来改变其他类?如果您有更改BankAccountHolderBankEmployee因为在一个技术细节类Account类改变了吗?

这可能似乎没有直接回答你的问题,但我认为这个问题的唯一答案一般就是说明你每次碰到它时应该问自己要回答的问题......这种情况几乎每次你都会发生写一堂课.

如果我的插图不清楚,请告诉我如何澄清它:你问过一个重要的问题,重要的是你要掌握它的答案(以及你所要求的).