Effective Java3.6-避免创建不必要的对象

6 避免创建不必要的对象

主要内容:讲述了在使用对象的时候前,先考虑一下是否需要创建,如果这个对象是不需要/不会改变,就最好不要重复创建。接着要考虑现有的代码中是否会出现重复构建同款实例的情况,如果出现应该如何避免,比如正则和自动装箱。最后反过来说“小对象随便搞,重量级注意点搞,确实没法搞就用保护性拷贝的方法复制一个同款对象”。

主要目标:1.String不要随便用new String的方法。2.String的正则判断最好自行实现一个正则对象。3.优先是利用类型而不是装箱的基本类型,即多用int,少用Integer,更不要int和Integer混用。4.识别“应该使用单例/不要创建多余的同款对象”和“应该拷贝一份使用而不要动原来的对象”的情景。

实际应用场景:String,String正则,自动装箱,Map.keySet()

Effective Java知识点摘录+白话说明

  1. 重用方式既快速,又流行。如果对象是不可变的,它就始终可以被重用

    就是可以重复使用的对象,让他就这么一个就好了,没必要额外再创建,创建在多个也只是使用同样的参数/方法。因此,new少点用。

  2. 对于同时提供了静态工厂方法和构造器的不可变类,通常优先使用静态工厂方法而不是构造器,以避免创建不必要的对象。

    优先使用提供静态工厂方法来创建实例对象并使用,因为既然能够提供给到,那么大概率是不会发生内部变化(甚至参数都没有的)。而且可以通过这个方法来获得对象而不会重复创建对象。

  3. 有些对象创建的成本比其他对象要高得多,如果重复地需要这类“昂贵的对象”,建 将它缓存来重用。

    至于怎么保存,待我后面回来补充,现在一时之间没想到。

  4. 如果一个对象是不变的,那么它显然能够被安全地重用,但其他有些情形则并不总是这么明显。考虑适配器( adapter )的情形,有时也叫作视图。

    意味着在一些方法中返回的实例,实际上是只有一个,就算你调用在多次,其实那还是同一个。比如Map.keySet(),不管你用什么set变量存放返回的数据,其实都是同一个数据。

  5. 自动装箱使得基本类型和装箱基本类型之间的差别变得模糊起来, 但是并没有完全消除。优先使用基本类型而不是装箱基本类 型,要当心无意识的自动装箱。

    少混着用基本类型和装箱基本类型,容易出现性能问题。

  6. 不要错误地认为本条目所介绍的内容暗示着“创建对象的代价非常昂贵,我们应该要尽可能地避免创建对象” 。

    这里说的十分中肯也挺不负责任的,他的意思是“我们要根据对象的重量来判断要不要多创建或者保护性拷贝。要相信JVM它足够优秀可以自行搞定。”,所以就只能在开发过程自行决定了。

  7. 注意,在提倡使用保护性拷贝的时候,因重用对象而付出的代价要远远大于因创建重复对象而付出的代价 必要时如果没能实施保护性拷 贝,将会导致潜在的 Bug 和安全漏洞;而不必要地创建对象则只会影响程序的风格和性能。

    没有白话,就是简单的判断重用对象代价与创建同款对象代价哪个大,根据判断结果来决定是不是使用保护性拷贝操作。

个人总结

Q:如何判断我‘不小心’重复创建了对象?

A:逢new思考,逢依赖注入思考

Q:什么时候需要像使用String.mtches例子那样自行创建静态Pattern类实例来避免重复创建Pattern对象的情况?

A:这个嘛,只能多看源码了,而且在实际开发中建议自行创建测试样例,来检查是否出现创建同款对象的情况来进一步优化。

Q:保护性拷贝是什么?

A:后面补充,现在我也才看到第6条

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值