Getter与Setter相关知识笔记

记录一下看到关于Getter和setter的相关文章的笔记。
一、 为什么使用存取方法?
文章1给的答案:
Getter和Setter使得API更加的稳定。比如,假设类中有一个公共属性,它可以被其他类直接存取。一段时间后,你想要在读取或保存这个公共属性的时候添加额外的逻辑。这将影响到已经使用这个API的类。所以对这个公共属性的任何改变都会导致引用这个属性的其他类的改变。相反,使用存取方法,我们可以随后很容易的添加其他的一些逻辑,比如缓存数据,延迟加载。而且,如果新的属性值与旧的属性值不同,我们还可以触发属性改变事件。所有这些对于通过使用存取方法获取值的类来说都是透明的。
疑问:很标准,但有个疑问,平时工作中绝大多数的都只是简单的读取与设置。如题是这样,不涉及业务逻辑,设置为public可以?
二、 是否要对所有的属性都是使用存取方法?
文章1给的答案:
如果一个类是包级私有或是私有嵌套类可见,假设它的属性字段很好的描述了类所提供的数据,那么对外暴露这些属性字段本质上是没有问题的。
疑问:正如文中所写"属性字段很好的描述了类所提供的数据",如果这样,为何只限定在包级类或嵌套类?

三、 私有属性 + 公共存取方法 == 封装
文章1的此小节,很有启发。
Getter/Setter和封装性没有任何关系。数据并没有比使用公共属性获得更多隐蔽或封装。其他的类对这个类的内部细节仍然了如指掌。类的改动可能会蔓延,迫使依赖它的其他类做出相应的修改。以这种方式使用的Getter和Setter通常破坏了封装性。
一个真正完整封装的类是没有setter方法的,而且最好也没有getter方法。类应该负责使用自身的数据计算并返回结果,而不是从某个类获得数据并计算这些数据。
所有的属性都应该保持私有,但对不可改变的属性仅仅增加setter方法。增加一个不必要的getter会暴露内部结构,这也增加了代码耦合的机会。避免方案是在每次增加存取方法的时候,我们应该分析是否可以通过封装行为来替代存取方法。
====================================
让我们看看另一个例子,

public class Money {
private double amount;
 
public double getAmount() {
 return amount;
}
 
public void setAmount(double amount) {
 this.amount = amount;
}
 
//client
Money pocketMoney = new Money();
pocketMoney.setAmount(15d);
double amount = pocketMoney.getAmount();  // we know its double
pocketMoney.setAmount(amount + 10d);
}
=========================================================
依据以上的逻辑,假设我们随后认为数据类型double不够合适,而是应该使用BigDecimal,这样那些已经使用了这个类的客户端代码也会失效。

让我们重建上面的例子,

public class Money {
private BigDecimal amount;
 
public Money(String amount) {
this.amount = new BigDecimal(amount);
}
 
public void add(Money toAdd) {
amount = amount.add(toAdd.amount);
}
 
// client
Money balance1 = new Money("10.0");
Money balance2 = new Money("6.0");
balance1.add(balance2);
 
}

与之前直接请求数据不同,类负责增加它自己的值。使用这种方式,将来任何改变数据类型的请求都不需要改变任何客户端代码。这样,不仅仅封装了数据,而且也封装了数据的保存方式甚至数据是否存在的事实。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值