【重拾Effective Java】一
之前看这本《Effective Java(第二版)》都是非常早曾经了。这本书确实是本好书。须要细嚼慢咽,每次看都有不同的体验。
在此写博客巩固一下。
第一章.创建和销毁对象
考虑用静态工厂方法取代构造器
通常我们获取类的实例,较为经常使用的方法是使用构造器。而这里要讲的是使用公有的静态工厂方法(注意:静态工厂方法和设计模式中的工厂方法模式是不允许思)
- 静态工厂方法与构造器的不同,第一优势是它们有名称。假设构造器的參数本身没有确切的描写叙述正被返回的对象,那么具有名称的静态工厂会更easy使用,代码也将更易理解。一个类仅仅能有一个带有指定签名的构造器,当然我们能够通过不同參数去制作多个构造器,只是这带来的麻烦是让代码更加复杂,或者是记不住。而静态方法有名称。所以不受限制。
- 静态工厂方法不必在每次被调用的时候创建一个新的对象。静态工厂方法能够为反复的调用返回同样的对象。这样有助于类总能严格控制在某个时刻哪些实例应该存在,这种类被称作实例受控的类。
- 静态工厂方法能够返回原返回类型的不论什么子类型的对象。
公有的静态工厂方法所返回的对象的类不仅能够是非公有的,并且该类还能够随着每次调用而发生变化,这取决与静态工厂的參数值。仅仅要是已声明的返回类型的子类型,都是同意的。
静态工厂方法返回的对象所属的类,在编写包括该静态工厂方法的类能够不必存在。这中灵活的静态工厂方法构成了服务提供者框架的基础。服务提供者框架:多个服务提供者实现一个服务,系统为服务提供者的client提供多个实现。并把他们从多个实现中解耦出来。服务提供者框架中有三个重要的主键:服务接口,这个是提供者实习的。提供者注冊API。这是系统用来实现注冊,为了让client訪问它们的,服务訪问API。是client用来获取服务的实例的。服务訪问API一般同意可是不要求client指定某种提供者的条件。假设没有这种规定,API就会返回默认实现的一个实例。服务訪问API是“灵活的静态工厂”,它构成了服务提供者框架的基础。
服务提供者的第四个接口是可选的,服务提供者接口,这些提供者负责创建其服务实现的实例。
假设没有服务提供者接口。实现就依照类名称注冊,并通过反射方式进行实例化。
- 静态工厂方法在创建參数化类型实例的时候。代码更加简洁,例如以下的一段代码:
Map<String。List<String>> map=
new HashMap<String,List<String>>();//这种写法比較麻烦 <pre name="code" class="java">//假设HashMap 提供了这个静态工厂:
public static <K,V> HashMap<K,V> newInstance(){
return new HashMap<K,V>();
} //那么我们就能够这么写。例如以下
Map<String,List<String>> map=HashMap.neweInstance(); - 静态工厂方法的缺点:类假设不含有公有的或者受保护的构造器。就不能被子类化,对于公有的静态工厂所返回的非公有类。也是这样。
- 静态工厂方法的缺点:它们与其它静态方法实际上没有不论什么差别。
遇到多个构造器參数时要考虑用构建器
静态工厂和构造器都有局限性,不能非常好的扩展到大量的可选參数。通常我们习惯採用重叠的构造器
public A(int a,int b){
this.A(a,b,1);
}
public A(int a,int b,int c){
///////
}
我们能够发现。重叠构造器是可行的。只是面对多个參数时,就会异常复杂了。那么我们就要用到JavaBeans模式了。
public int a=0;
public int b=0;
public int c=0; public A(){
public void seta(int a){
this.a=a;
}
public void setb(int b){
this.b=b;
}
public void setc(int c){
this.c=c
}
}
这样就弥补了重叠构造器的复杂的不足。
只是。JavaBeans本身也是有缺陷的。由于构造过程被切割到几个调用中,在构造过程中JavaBeans可能处于不一致的状态,类无法只通过检验构造器參数的有效性来保持一致性。视图使用处于不一致状态的对象,将会导致失败。
用私有构造器或者枚举类型强化Singleton属性
singleton指只被实例化一次的类,Singleton往往用来代表那些本质上唯一的系统组件。
通过私有构造器强化不可实例的能力
有时候我们须要编写仅仅包括静态方法和静态域的类,经常我们须要用到java.lang.Math里的方法,当中的调用就是如此。
避免创建不必要的对象
通常最好能重用对象而不是在每次须要的时候就创建一个同样功能的新对象,对于同一时候提供了静态工厂方法和构造器的不可变类,通常能够使用静态工厂方法而不是构造器,以避免创建不必要的对象。通过维护对象池来避免创建对象并非一种好的做法,除非池中的对象是非重量级的。
真正正确使用对象池的典型是数据库链接池,建立数据库链接的代价输非常昂贵的,所以重用这些对象就非常有必要了。
消除过期的对象引用
消除过期的引用最好的办法是让包括该引用的变量结束其生命周期。假设是在最紧凑的作用域范围内定义每个变量,这样的就会发生。一般来说,仅仅要是自己管理内存的,我们就应当警惕内存泄漏问题,一旦元素被释放掉,则该元素中包括的不论什么对象引用都应该被清空。
内存泄漏的一个常见来源缓存。一旦你把对象的引用放到缓存中,就非常easy被遗忘掉。
内存泄漏的还有一个来源监听器和其它回调,假设你实现了一个API,client在这个API中注冊回调。却没有显示地取消注冊,那么除非你採取某些动作。否则就会累积。解决方式是仅仅保存它们的弱引用。
【重拾Effective Java】一的更多相关文章
- 【Java】 重拾Java入门
[概论与基本语法] 取这个标题,还是感觉有些大言不惭.之前大三的时候自学过一些基本的java知识,大概到了能独立写一个GUI出来的水平把,不过后来随着有了其他目标,就把这块放下了.之后常年没有用,早就 ...
- 重拾Java Web应用的基础体系结构
目录 一.背景 二.Web应用 2.1 HTML 2.2 HTTP 2.3 URL 2.4 Servlet 2.4.1 编写第一个Servlet程序 2.5 JSP 2.6 容器 2.7 URL映射到 ...
- effective java笔记之java服务提供者框架
博主是一名苦逼的大四实习生,现在java从业人员越来越多,面对的竞争越来越大,还没走出校园,就TM可能面临失业,而且对那些增删改查的业务毫无兴趣,于是决定提升自己,在实习期间的时间还是很充裕的,期间自 ...
- Effective Java阅读笔记——引言
“我很希望10年前就拥有这本书.可能有人认为我不需要任何Java方面的书籍,但是我需要这本书.” ——Java之父 James Gosling 在图书馆找到这本java著作时,首先看到了这句话. ...
- [Effective Java]第八章 通用程序设计
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Effective Java通俗理解(持续更新)
这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...
- 重拾《 两周自制脚本语言 》- Eclipse插件实现语法高亮
源码库: program-in-chinese/stone-editor-eclipse 参考: FAQ How do I write an editor for my own language? D ...
- 《Effective Java 第三版》新条目介绍
版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...
- Effective Java通俗理解(上)
这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...
随机推荐
- elasticsearch index 功能源码概述
从本篇开始,对elasticsearch的介绍将进入数据功能部分(index),这一部分包括索引的创建,管理,数据索引及搜索等相关功能.对于这一部分的介绍,首先对各个功能模块的分析,然后详细分析数据索 ...
- 关于jquery的事件命名空间
在多人协作的前端开发中,或许会遇到一个问题:几个开发人员都给一个元素添加了同样的事件,但是又有开发人员想要解除掉元素身上的某个事件效果,这时候操作起来就有些麻烦,需要用到jquery给我们提供的事件命 ...
- 认知 Git 和 GitHub
今天被一个大牛的大哥问了个问题,问住了.原问题是“你是到github吗?git呢?” 我堂而皇之的说,“他们不是同一个吗?” 结果大牛大哥狠狠地回了我一句“百度去”..好吧我乖乖去百度了. 这是我百度 ...
- css3--根据数据加载显示的一个动画
css: .circle { width: 200px; height: 200px; position: absolute; border-radius: 50%; background: #0cc ...
- IOS - 获取UITextField的输入文本
当UITextField文本改变时, 依据内容更新数据, 通过写监听事件就可以. 加入监听: [timesField addTarget:self action:@selector(textField ...
- [Python] Python's namedtuples can be a great alternative to defining a class manually
# Why Python is Great: Namedtuples # Using namedtuple is way shorter than # defining a class manuall ...
- 转:Java的一道面试题----静态变量初始化过程
public class Test{ private static Test tester = new Test(); //step 1 private static int count1; //st ...
- Linux 内存管理与系统架构设计
Linux 提供各种模式(比如,消息队列),但是最著名的是 POSIX 共享内存(shmem,shared memory). Linux provides a variety of schemes ( ...
- 一个理性战胜感性的成功案例:P2P投资和活期理财,纠结中提炼出来的1个数学问题
我经常是投资了P2P,然后用钱,因而损失了一部分收益. 这是一个让我纠结的问题,为了解决这个问题,我不再凭感觉,而是从现实情况,提炼出来1个数学题,解答我的疑惑. 这是一个理性战胜感性的成功案例~ P ...
- HTML高级标签之表格标签
前面学习了一下HTML的经常使用标签, 今天開始高级标签之路! 一.表格标签 1.作用: 创建一张表格 2.各属性作用: <table cellspacing="0" cel ...