【重拾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代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...
随机推荐
- Jmeter作为工具的性能测
[原创]相对完整的一套以Jmeter作为工具的性能测试教程(接口性能测试,数据库性能测试以及服务器端性能监测) 准备工作 jmeter3.1,为什么是3.1,因为它是要配合使用的serveragent ...
- Linux下几种另类创建文件之方法
以前我们用编辑器例如vi来新建文件,下面介绍几种另类生成文件的方法,多用在备份和测试上. 创建文件的方法: 1.echo 命令 #echo "set bell" >& ...
- Kinect 开发 —— Kinect Interaction 交互控件
Kinect Interactions 提供了一些新的带有姿势识别的控件如 push-to-press 按钮, grip-to-pan 列表控件, 而且支持多用户,同时二个人进行的交互,这些新添加的控 ...
- Checkpoint & cache & persist
checkpoint checkpoint(检查点)是Spark为了避免长链路,大计算量的Rdd不可用时,需要长时间恢复而引入的.主要就是将通过大量计算而获得的这类Rdd的数据直接持久化到外部可靠的存 ...
- dp水题
hdu 2084: #include <stdio.h> #include <iostream> #include <string.h> using namespa ...
- 牛客网剑指offer刷题总结
二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...
- ios学习之旅---c语言函数
1.函数的概述 C源程序是由函数组成的. 尽管在前面各章的程序中大都仅仅有一个主函数main(),但有用程序往往由多个 函数组成. 函数是C源程序的基本模块,通过对函数模块的调用实现特定的功能. C语 ...
- HDU1023 Train Problem II【Catalan数】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1023 题目大意: 一列N节的火车以严格的顺序到一个站里.问出来的时候有多少种顺序. 解题思路: 典型 ...
- 1.Node.js
转自:http://www.runoob.com/nodejs/nodejs-tutorial.html 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基 ...
- Vue的学习--环境配置
1. 下载vue.min.js或者使用CDN 2. 安装Vue-cli环境 我在window7 32位下使用命令行cmd进行的操作 安装之前应该使用node -v和npm -v检查一下node和n ...