创建和销毁对象

相比于构造函数,考虑使用静态工厂方法

如果自己写的类,希望客户端能创建它的实例,一般自己要提供哪些方式?
  • 提供公有构造函数
  • 提供公有静态工厂方法
公有静态工厂方法有什么优点?
  • 它有名字,代码易于理解
  • 它可以避免创建不必要的重复对象
  • 它可以返回该类型的任何子类型的实例
公有静态工厂方法有什么缺点?
  • 仅仅提供公有静态工厂方法,而不提供公有或受保护的构建函数,该类将不能被继承。但可以考虑使用组合来弥补该缺点。
  • 它不容易被程序员发现
公有静态工厂方法惯用命名有哪些?
  • from
  • of
  • valueOf
  • instance or getInstance
  • create or newInstance
  • getType
  • newType
  • type

当面对多个构造函数参数时,考虑使用Builder模式

静态工厂和构造函数的缺点有哪些?
  • 当构造函数的参数,尤其是可选参数,越来越多时,扩展性不好,不易阅读
JavaBeans模式的缺点有哪些?
  • 由于构建过程被分为多步,该实例可能会造成不一致的状态
  • 妨碍该类的不可变性
Builder模式解决了静态工厂和构造函数,以及JavaBeans的缺点,但它自身有哪些缺点?
  • 为了创建对象,必须首选创建它的Builder

利用私有构造函数和枚举,以加强单例特性

解释单例
  • 仅仅被实例化一次的类
怎么实现单例?
  • 公有的static final 域
  • 公有的static工厂方法
  • 利用枚举类
利用公有的static final域或static工厂方法实现单例的缺点有哪些?
  • 反射攻击问题。
  • 复杂的序列化问题。
针对上一条的缺点和问题,有哪些解决办法?
  • 针对反射攻击:修改构造函数,使其当发现创建第二个实例时,throw an exception。
  • 针对序列化问题:添加implements Serializable, 所有的实例域前添加transient,添加readResolve方法
private Object readResolve() {
  return INSTANCE;
}
除了上述的解决办法,有没有更简单的办法?
  • 使用枚举类创建单例,可以同时解决反射攻击和序列化的问题。

利用私有构造函数,使类不能被实例化

你写了个工具类,不希望该类被人实例化,有什么办法?
  • 该类设为final
  • 添加私有构造函数,并在私有构造函数内部添加
throw new AssertionError();

不要硬编码resources,而是要选择dependency injection

  • 不要用静态工具类或单例实现依赖underlying resources的类,不要让该类直接创建该resources,而是要用依赖注入,即把这些resources传入到constructor 或者 static factory 或者 builder 来创建。或者使用Spring等其他框架创建。

为了避免创建不必要的对象,有哪些建议?

  • 再利用单例,而不是重新创建功能一样的实例。
  • 优先使用静态工厂方法,而不是每次都用构造函数创建新对象。比如
Boolean.valueOf(String) 而不是 Boolean(String)
  • 合理使用cache,利用static final 域 事先cache一些耗性能的对象创建。
  • 合理使用代理,比如Map对象中的keySet方法
  • 警惕无意识的autoboxing

消除无用的对象引用,有哪些建议?

  • 该对象赋值为null
  • 尽量减少该对象的scope
  • 巧用WeakHashMap

为什么不要用finalizers and cleaners,不要用System.gc和System.runFinalization?

  • 它们不能保证及时的执行
  • 它们可能被终止
  • 使用finalizers,会导致 uncaught exception 将被ignored
  • 都会带来性能损失
  • 存在安全问题

相对try-finally,为什么优先使用try-with-resources

  • try-with-resources更简洁
  • try-with-resources 生成的exception更有帮助性


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容