我目前正在学习Java并了解encapsulation,而且我不确定以下哪项是更好的做法:
该值未被操纵,仅通过System.out.println()显示;
任何建议都将受到赞赏:)
编辑:一个班级(人)持有关于人的信息,例如姓名,年龄,体重等,另一个班级(目录)有一个方法,用于搜索人的LinkedList以找到具有匹配年龄的对象。如果找到某人,则该方法会打印出该人的姓名。答案 0 :(得分:5)
封装就是维护一个separation of concerns,其核心思想是一个类应该尽可能少地了解其他类的工作方式,部分原因是你可以对这些类进行更改而不必更改与他们互动的其他课程。
广泛地说:根据经验,你希望你的每个类都做“它自己的小事” - 拥有自己的小关注,所有逻辑都进入在该类的私有方法中执行封装这个小东西。如果其他类在做自己的小事情的过程中需要知道第一类的东西,那么你在该类中提供了公开那些东西的getter方法,而不会暴露它们的详细信息。内部实施。
关于你的问题,你提到的选项实际上是相同的:getter 是一种方法,被其他类调用以返回字段的值。这种方法的优点是封装包含它的类中的字段,然后可以解析/重新计算/存储或以其他方式与该字段交互,但只要它是{{{ 1}}返回预期的数据类型。
为了说明,假设您使用getter
字段创建了BankAccount
类。你做了一些测试,似乎工作正常,所以你创建了几个引用这个double balance
字段的其他类。在某些时候,你会注意到你的一些计算结果只有几美分。您进行了一些研究,发现使用balance
存储货币值是不好的做法,而您应该使用名为double
的类。
如果您的其他课程直接访问了您的BigDecimal
字段,则他们都必须更改(并且所有人都必须导入balance
,即使他们从不直接使用它),以便促进此更改。另一方面,如果他们通过getter方法访问帐户BigDecimal
,您可以在balance
中将balance
的类型更改为BigDecimal
将BankAccount
的返回类型保留为getBalance()
,同时调用double
的{{1}}方法返回其他类所期望的BigDecimal
值:没有其他类将知道您已更改数据类型。
说明关注点分离的另一种方式是说每个类应该有一个改变的理由(这是@ GregKopff评论中引用的single responsibility principle):需要更改toDouble()
字段的数据类型是double
更改的正当理由,但这是一个有效的原因还是与其交互的所有其他类都要更改?您是否需要更改balance
或BankAccount
课程,因为BankAccountHolder
课程中的技术细节已更改?
这可能似乎没有直接回答你的问题,但我认为这个问题的唯一答案一般是为了说明你应该问你自己来回答它的问题每当你碰到它时......每次写课时都会发生这种情况。
如果我的插图不清楚,请告诉我如何澄清它:你问过一个重要的问题,重要的是你要掌握它的答案(以及你所要求的。)
答案 1 :(得分:0)
我的建议是使用Getters and Setters。 getter是公共方法,它返回各自字段的值。 Setter是公共方法,用于设置各自字段的值。
public class YourClass {
private String yourMember;
public String getYourMember() {
return this.yourMember;
}
public void setYourMember(String member) {
this.yourMember = member;
}
}
并使用这些方法来获取或设置变量的值。
public class AnotherClass {
public void someMethod() {
YourClass yc = new YourClass();
yc.setYourMember( "Value" );
System.out.println( yc.getYourMember() );
}
}
但是如果打印该值是该类行为的一部分,那么如果您还向类中添加printYourMember()
方法会更好。这确实是一个上下文敏感的问题。在不了解实际情况的情况下,我无法给出更具体的答案。
祝你好运!