1. 遇到多个构造器考虑建造器

多个构造器,只有参数列表不同,应用起来会很不方便,容易混淆,参数过多,调用的时候可能并不知道如此多的参数具体代表什么含义。比如我们可能会有以下的代码片段:

public class Test {public Test(String a, int b, boolean c, long d){}public Test(int a, int b, boolean c, long d){}public Test(int a, String b, boolean c, long d){}public Test(float a, double b, int c, long d){}
}

Test类拥有很多构造方法,但是由于构造方法过多导致含义模糊,我们在实例化Test的对象的时候,不知道具体应该调用哪一个构造方法,所以有的时候我们可能会在类中写一个无惨的构造方法,然后这样为Test中的属性赋值:

Test test = new Test() ;
test.setA(a) ;
test.setB(b) ;
test.setC(c) ;
test.setD(d) ;

这样的代码看以来没什么不妥,不过从EffectiveJava书中,这种方式会发生一个问题,JavaBean状态不一致问题,下述讲述。

总之,如果存在多个构造器的时候,需要考虑用Builder模式。构建builder模式,可以保证JavaBean一致性,用户提前设置属性到builder中,然后通过builder来构建Bean实例,由于静态内部类可以产生多个实例,所以多个线程访问会出现多个实例,不会影响当前builder实例的内容,builder对象不受影响,通过builder构造Test也就没有状态不一致的问题了。如下代码:

public class Test {private String name ;private int age ;public Test(TestBuilder builder){this.age = builder.age ;this.name = builder.name ;}public static class TestBuilder{private String name ;private int age ;public TestBuilder name(String name){this.name = name ;return this ;}public TestBuilder age(int age){this.age = age ;return this ;}public Test build(){return new Test(this) ;}}public static void main(String[] args) {Test test = new TestBuilder().age(11).name("EffectiveJava").build();}
}

2.JavaBean状态不一致

个人理解JavaBean状态一致:用户用指定的参数创建JavaBean,创建之后此JavaBean内包含的属性值与用户指定的参数值相同,上述代码中,如果用构造方法创建的对象,是可以保持一致性的,因为程序在执行构造方法之后,才生成新的实例,所以实例中的属性值和用户指定的必定相同,因为在调用构造方法之前根本没有对象产生,用户无法通过一个不存在的对象来操作对象的属性。用set来设置JavaBean的值,不能保持一致性,创建对象后,用户通过set来设置属性值,但是在设置之后,另外的用户可以通过其他线程来调用set方法来更改此属性,此时也就是JavaBean状态不一致。

3.攻击单例模式

单例模式大家都很熟悉,例子我不在举出,只讨论在什么情况下会产生多个实例:

1.反射机制,我们可以通过反射来调用单例类的私有构造方法来创造对象。解决方式:可以再类的私有构造方法中增加判断,第二次创建该对象时候抛出异常。

2.IO流反序列化,利用IO流对类进行反序列化时,会生成新的对象。解决方式:单例类实现readResolve方法。

4. 避免创建不必要的对象

如果变量不需要改变,则声明为常量,不要每次都new一个对象

计算应该用基本数据类型,而不是用封装类。如使用int、long,但要规避使用Integer、Long

EffectiveJava阅读感想一相关推荐

  1. “云时代架构”经典文章阅读感想十二

    云时代架构"经典文章阅读感想十二 (牛逼的架构师是怎么炼成的?) 前几周阅读的三四十岁的大龄程序员,应该如何保持自己的职场竞争力?中提到如何在35岁左右可以实现掌握有核心竞争力.其中之一便是 ...

  2. “云时代架构”经典文章阅读感想十六

    云时代架构"经典文章阅读感想十六 (支付宝架构师眼中的高并发架构) 经过这一学期的阅读,看到最多的一个名词就是高并发. 高并发高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒 ...

  3. “云时代架构”经典文章阅读感想八

    "云时代架构"经典文章阅读感想八 (支持百万连接的系统应该如何设计其高并发架构) 连接共分为四个步骤:1建立连接.2.发送请求.3.返回响应.4.断开连接.系统通信就是通过建立连接 ...

  4. 《重新定义团队》读书笔记及阅读感想2600字

    2019独角兽企业重金招聘Python工程师标准>>> <重新定义团队>读书笔记及阅读感想2600字: <重新定义团队>的作者是是谷歌前任首席人才官拉斯洛·博 ...

  5. Ph.D Grind 阅读感想 By 张雄

    #Ph.D Grind是Xin Zou老师推荐的一本书,邮件里本来说是要在三周内读完的,不料看了个Preface之后再也放不下,最终一口气地看完了. #看完之后很有感触,之前也阅读过一本讲如何规划研究 ...

  6. 采访前高级软件工程课程学员付浩同学,及Scrum总结阅读感想

    陈宇澄 我采访了第一届高级软件工程课程学员,现正在MSRA攻读MSRA-USTC联合培养博士生的07级师兄付浩同学.以下内容整理自采访笔录: 1.你们team当时做了什么项目?花了多少时间?你在tea ...

  7. Dynagon代码阅读感想

    因为要做动态网络生成,于是去github找代码,看到这个dynagon比较对的上眼,于是clone下来慢慢研究. 链接:https://github.com/lanius/dynagon 于是我发现这 ...

  8. 自我介绍 and 阅读感想

    自我介绍 在你一生中身体最健康,精力最旺盛的时候,能在大学全职学习和研究,这是少有的机会.请说明一下,你是怎么选择了这个专业的? 大一入学科大的时候其实学的是物理专业.因为高中曾经自学物理竞赛,并且得 ...

  9. 阅读感想——《富爸爸穷爸爸》

    阅读这本书,是因为我姐姐的推荐.她建议我读读这本书,没有说原因.让我从上网买来读读.上个星期日推荐的,我今天读完.整整一个星期了.之所以这么快读完,一个是我在掌阅上看的电纸版的 ,其次是这本书不算太多 ...

最新文章

  1. 5分钟回顾Linux25年的发展历程与变迁
  2. Linux中文件系统简介
  3. Pictures for active reading.Unit 1 Food and health.
  4. 基本类型和引用类型的值 函数的传递参数
  5. Java 并发编程之 ConcurrentLinkedQueue
  6. 中国首个5G全覆盖产研一体化创新园启动
  7. 架构师之路(2)---详解面向过程
  8. mysql limit报错_mysql limit 附近老是报错,求帮助!
  9. PyCharm设置Python版本
  10. UnrealVS插件使用简介(UBT编译,UE4热更新)
  11. 星广互动推出全球首个智能AR广告平台 重塑UGC视频广告价值
  12. PLC基础知识(PLC入门必看)
  13. Rax初学者使用心得
  14. Elasticsearch学习4《Elasticsearch的各种查询》
  15. cesium鼠标控制键盘_Package - cesium-plotting-symbol
  16. 35行代码搞定事件研究法(下)
  17. 【动手学强化学习】DDPG+HER
  18. UICollectionView基本使用详解(OC)
  19. 洛谷 P2884 【[USACO07MAR]每月的费用Monthly Expense】
  20. 一对一视频直播源码|手机视频直播平台android源码/可打包视频直播

热门文章

  1. PPT卡片排版技巧,快来收藏
  2. AMR中的RO,RW和ZI
  3. android 程序白屏,Android冷启动白屏问题
  4. 获得拼多多商品详情(商品主图、sku)
  5. python实现猫抓老鼠
  6. CAD中插入外部参照字体会变繁体_提高CAD绘图效率,外部参照你真的懂?
  7. 简单实用!一文掌握效度分析所有知识点!
  8. 计算机大专考试题,计算机大专考试试题一
  9. macOS 安装lrzsz
  10. php毕设代做,客户管理系统,java,jsp,php,好毕设为你指导如何完成一个客户管理系统...