EJ系列13-15条

由于某些原因,断更了一段时间,非常抱歉,不过,im back~

点这里阅读==》上一篇

第13条 使类和成员的可访问性最小化

设计良好的模块对外部而言总是隐藏了所有的细节  

模块之间中通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念被称为信息隐藏封装,是软件设计的基本原则之一(还是封装好听啊,信息隐藏好low啊)

封装可以有效解除各个模块之间的耦合关系,是现在模块化开发的基础,使模块可以独立地开发、测试、优化、使用、理解和修改

尽可能地使没各类或者成员不被外界访问。

Java中可以通过访问修饰符(private protected public)控制类、接口和成员的可访问性(accessibility)  

除了应该暴露的API之外,我们应该尽可能少的开放访问权。
因为一旦暴露给外界,可能会有风险,另外还需要保证一直维护与兼容。

可以想象一下,当我们使用一个第三方库的时候,如果它暴露了一个不该暴露的类(假设为BitmapUtil),而我们恰好用了它里面的方法,结果它一升级,把方法改了,或者把方法去掉了,那我们不是懵了?

所以不要去暴露那些不该暴露的类、接口、成员

小结

作者在最后给了小结,应该始终尽可能地降低可访问性。应该防止把任何散乱的类、接口和成员变成API的一部分。除了公有静态final域的特殊情形之外,共有类都不应该包含公有域。并且要确保公有静态final域所引用的对象都不是可变的  

第14条 在共有类中使用访问方法而非公有域

假设有一个类:

public class Point{
    public double x;
    public double y;
}

作者的意思是不应该直接暴露x y,要为它们提供gettersetter方法,这样有利于添加约束条件,辅助行为。

本人表示道理我懂,但是现在一般的类都不愿意去写getter setter了,真心觉得好烦啊,虽然方法可以用AS自动生成,我还是不太愿意去写,直接public就是那么任性

第15条 使可变性最小化

不可变类:实例不能被修改的类每个实例中包含的所有信息都必须在创建该实例的时候就提供,并在对象的整个生命周期内固定不变。如:String、基本类型的包装类、BigInteger和BigDecimal
不可变类比可变类更加易于设计、实现和使用。它们不容易出错,且更加安全。

不可变类的五条规则:

  1. 不要提供任何会修改对象状态的方法。

  2. 保证类不会被扩展。 一般用final修饰

  3. 使所有的域都是final的。

  4. 使所有的域都成为私有的。(降低访问权限)

  5. 确保对于任何可变组件的互斥访问。(什么意思呢?)

不可变类的优缺点

线程安全

不要求同步,无惧多线程并发访问

不可变对象可以被自由地共享

所以不需要保护性拷贝(如String类的拷贝构造器)
也可以重复利用,如:Boolean.FALSE/TRUE

不可变对象为其他对象提供了大量的构建(building blocks)

不是很懂

唯一的缺点:对于每个不同的值都需要一个单独的对象

如FALSE TRUE ,不过如果值少,到也没什么关系
但是如String这样的不可变类,我们需要注意,多用StringBuilder(可变,性能好)

小结

除非有很好的理由要让类成为可变的类,否则就应该是不可变的。
如果类不能被做成是不可变的,仍然应该尽可能地限制它的可变性。(降低出错的可能性)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值