effective java



23.请不要再新代码中使用原生态类型
泛型擦除是为了兼容老代码,泛型是在编译时发现问题,而非运行,因为运行时已擦除

24.消除非 受检警告
局部注解 小范围解除

25.列表优于数组
列表--编译发现问题 非 协变 不可具体化
数组—运行发现问题 协变    可具体化

38.检查参数有效性
通过 断言更优雅的实现测试

39.必要时进行保护性拷贝
防止对象被改变

40.谨慎设计方法签名
分解  辅助类  多用接口少用类

41.慎用重载
重载是编译发现问题, 覆盖是运行发现问题

42.慎用 可变参数
放置于最后 类型...名称   隐含创建数组

43.返回零长度的数组和集合,而不是null
零长度优点是可共享 不可变

44.为所有导出的API元素编写文档注释
包括 类 接口 构造器 方法 域
params return should do
常量 参数 成员

45.将局部变量的作用域最小化
用时声明  for优于while  try catch的类型检查

46.foreach 优于 for
for有太多next 需要区分内外层 | foreach 不适用于指定元素或多个集合操作

47.了解和使用类库
lang util I/O

48.如果需要精确的答案,请避免使用float和double
decimal long  int

50.如果其他类型更适合 避免使用 字符串
尤其是枚举和聚集

51.当心字符串的连接功能
大量字符串用 stringbuilder

52.通过 接口引用对象
除非  给定数值类 抽象积累 特殊方法,这三种情况采用类

54.谨慎地使用本地方法
不要轻易使用其他语言优化代码

55.谨慎优化
不要过度优化

56.遵守普遍接受的命名惯例
包 类和接口 方法或者域 常量域 局部变量  类型参数


57.只针对异常的情况才使用异常
别用于控制代码流程

58.对可恢复的情况使用受检异常,对错误编程使用运行时异常
受检异常至少给出操作提示


59.避免不必要地使用受检的异常
受检可转为未受检

60.优先使用标准的异常
常见非法参数和状态

61.抛出与抽象对象相应的异常
要容易理解,保持一致性

62.每个方法抛出的异常要有文档
受检抛出throw,区分受检和非受检

63.在细节消息中包含能捕获失败的信息
数据/堆栈轨迹

64.努力使失败保持 原子性
异常为不变,错误是发生了改变;可逆性或说状态未改变

65.不要忽略异常
至少给出忽略原因

49.基本类型优先于 装箱基本类型
会带来同一性比较和性能问题 ,常用于 集合 参数化类型和反射机制

53.接口优先于 反射机制
反射用来获取constructor method field,当与未知类一起工作时,可用来实例化对象,而通过接口或者超类访问它


13.使类和成员的可访问性最小化
包级私有和域私有 ,除非 公有静态final类

14.在公有类中使用访问方法而非 公有域
不暴露数据 而暴露行为

15.使可变性最小
不可变更牢固和安全, 静态工厂可提高效率

16. 复合优先于继承
确实是is-a关系采用继承,继承破坏了封装性,覆盖方法会带来问题,复合是私有域引用现有类的实例

17.要么为继承而设计,并提供说明文档, 要么就 禁止继承
继承的行为容易受牵连,切记,构造器不能调用可被覆盖的方法,如果被子类调用,存在没初始化的数据会出问题


18.接口优先于抽象类
接口更灵活,抽象类更容易演变,通过 骨架类来实现某个行为接口,同时具体实现接口中的抽象类别,

19.接口用于定义 类型(当类实现接口时,接口就充当可以引用这个类的实例的类型)
接口用于行为,而非具体的数据,出于安全考虑

21.用 函数对象表示策略
具体行为抽象成 策略接口,编写实现该接口的类,一次调用就用匿名类,多次调用使用 私有静态成员==>Singleton 

22.优先考虑静态成员类
静态成员类(没有外部引用 资源消耗小)
非静态成员类(外部引用) 匿名类(方法内部,一次创建实例,包括函数对象 过程对象和静态工厂方法内部) 局部类(方法内部 需要重复创建实例)

88.类层次优于标签类
层次结构分明,操作互不依赖,标签类 样板代码充斥,不容易扩展

3.用私有构造器或者枚举类型强化Singleton属性
公有静态 final 域,这个域总是包含相同的对象引用 | 私有构造器,保证了对象全局唯一性 | 序列化时 对象声明为 瞬时transient,避免反序列化一个序列化实例时,重复创建对象 , 单元素的枚举方法已经成为了最佳实现 Singleton的方法,功能上和私有域更接近,而且提供了序列化的功能

4.通过 私有构造器强化不可实例化的能力
比如工具类,实例对其没有意义,不要通过 抽象类强制不可实例化,这样别人会认为需要继承它,

5.避免创建不必要的对象
比如 string autobox 和 静态工厂 | 同时如果小对象,代价较小,那么,保护性拷贝对象依然是正确的选择

6.消除 过期的对象引用
只要类是自己管理内存的,比如stack和cache以及监听器和回调中潜藏的过期对象引用,就需要关注内存泄露问题,可通过显式赋值 null 终结对象

7.避免使用 终结方法
system.gc和system.runFinalization 轻易不要使用,可配合 try-finally确保及时终止方法

1.考虑用 静态工厂方法代替构造器
静态工厂是一个 返回类的实例的静态方法

2.遇见多个构造器函数时要考虑用 建造者模式
建造者模式,适用于多个参数的构造请情况,模拟了具名的可选参数,清晰简洁  new Class.Builder(x,y).param1(a).param2(b)

26.优先考虑泛型
如果不这样,转化成 object或是转化成 E,但是会有警告, 一个是类型不安全,一个是无法检验转换,

27.优先考虑泛型方法
泛型单例工厂给每个必要的类型参数分发对象+ 递归类型限制常用语Comparable

28.利用有限制通配符来提升API灵活性
PECS==>producer-extends  consumer-super

9.覆盖 equals时总要覆盖 hashCode
幂等性  equal相等hashCode必须相等  equal不相等hashCode不一定相等 | 散列码不能缺少必须的数据元素

10.始终覆盖 toString
打印的数据格式要返回对象中包含的虽有值得关注的信息

11.谨慎地覆盖 clone
避免clone对象影响原对象,建议不要覆盖clone方法

8.覆盖 equals时请遵守通用约定

特性: 自反性 对称性  传递性  一致性 

操作:覆盖 equal同时覆盖 hashcode(==检查参数是不是对象引用)  不要将object对象替换为其他类型( instance

原则:
复合优于继承无法扩展可实例化类的同时,既增加新组件,又保留euquals约定
里氏替换原则 ,基类可以出现的地方,子类一定可以出现 。 抽象类继承,子类不能覆盖父类的非抽象方法,可增加特有方法,前置条件更宽松,后置条件(返回值)更严格

12.考虑实现Comparable接口
Comparable 接口里面的 compare to 方法,可直接比较,相比于 Comparator



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值