最佳实践(Effective Java学习笔记)

最佳实践

  • 创建 Patter 实例的成本很高 ,因为需要将正则表达式编译成 个有限状态机( finite state machine,为了提升性能,应该显式地将正则表达式编译成一个 Patter 口实例(不可变),让它成为类初始化的一部分,并将它缓存起来,每当调用 isRomanNumeral 方法的时候就重用同一个实例

  • 优先使用基本型而不是装箱基本型,要当心无意识的自动装箱

  • 如果一个对象引用被无意识地保留起来了,

    那么垃圾回收机制不仅不会处理这个对象,而且也不会处理被这个对象所引用的所有其他对象

    即使只有少量的几个对象引用被无意识地保留下来,也会有许许多多的对象被排除在垃

    圾回收机制之外,从而对性能造成潜在的重大影响

    解决方法:一旦对象引用已经过期,只需清空这些引用即可

    清空过期引用的另一个好处是,如果它们以后又被错误地解除引用,程序就会立即抛

    NullPointerException 异常,而不是悄悄地错误运行下去 尽快地检测出程序中的错误总是有益的

  • 当程序员第一次被类似这样的问题困扰的时候,他们往往会过分小心 对于每一个对象

    引用,一旦程序不再用到它,就把它清 其实这样做既没必要,也不是我们所期望的,因

    为这样做会把程序代码弄得很乱。

    清空对象引用应该是一种例外 而不是一种规范行为

  • 一般来说 只要类是自己管理内存,程序员就应该 惕内存泄漏问题 一旦元素被释放掉,则该元素中包含的任何对象引用都应该被清空。

  • 内存泄漏的另一个常见来源是缓存

类设计

​ 区分一个组件设计得好不好,唯一重要的因素在于,它对于外部的其他组件而言,是否隐藏了其部数据和其他实现细节设计良好的组件会隐藏所有的实现细节, 把API与实现清晰地隔离开来 然后,组件之间只通过 进行通信,一个模块不需要知道其他模块的内部工情况这个概念被称为信息隐藏( info1mation ding )或封装( encapsul ati ),是软件设计的基本原 之一。

  • 尽可能地使每个类或者成员不被外界访问

  • 如果一个包级私有的顶层类(或者接口) 只是在某一个类的内部被用到,就应该考虑使它成为唯 使用它的那个类的私有嵌套类(详见第 24 条) 这样可以将它的可访问范围从包中的所有类缩小到使用它的那个类 然而,降低不必要公有类的可访问性,比降低包级私有的顶层类的可访问性重要得多:因为公有类是包的 API 部分,而包级私有的顶层类已经是这个包的实现的 部分。

  • 虽然引用本身不能被修改,但是它所引用的对象却可以被修改,这会导致灾难性的后果。 (final

  • 长度非零的数组总是可变的,所以 让类具有公有的静态 final 数组域,或者返回这种域的访问方法,这是错误的。

    修正方法:

    ​ private static final Thing[] PRIVATE_VALUES = { … };

    ​ public stat final List VALUES=

    ​ Collections.unmodifiablelist(A 「「 ays.aslist(PRIVATE_VALUES )〕;

    返回VALUES是明智的。

  • 公有类永远都不应该暴露可变的域 虽然还是有问题,但是让公有类暴露不可变的域,其危害相对来说比较小 但有时候会需要用包级私有的或者私有的嵌套类来暴露域,无论这个类是可变的还是不可变的。

  • 使可变性小化(不可变类),为了使类成为不可变,要遵循下面五条规则:

    1. 不要提供任何会 改对 状态的方法
    2. 保证类不会 扩展
    3. 声明所有的域都是 final的:通过系统的强制方式可以清楚地表明你的意图 而且,如果一个指向新创建实例的引用在缺乏同步机制的情况下,从一个线程被传递到另一个线程,就必须确保正确的行为。(线程安全)
    4. 声明所有的域都为私有的(不建议)
    5. 确保对子任何可变组件的互斥访问:如果类具有指向可变对象的域,则必须确保该类的客户端无法获得指向这些对象的引用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值