【重拾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代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...
随机推荐
- amaze ui表格斑马纹效果
amaze ui表格斑马纹效果 需要注意的是样式的写法,都是 am-table- ,很好记的 如果是条纹就是striped,如果是hover状态就是hover 用法很简单,点对应class,不同的cl ...
- css3.0+html绘制六边形
<section class="ass_desc"> <section class="ass_descLeft posRe"> < ...
- ES6第三节:变量的解构赋值
ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.下面我们看实际的例子: 一.数组解构: let [a,b,c] = [1,2,3]; console.log(a); //a ...
- iptables-save && iptables-restore iptables规则保存于还原
iptables-save命令用于将linux内核中的iptables表导出到标准输出设备商,通常,使用shell中I/O重定向功能将其输出保存到指定文件中. 语法 -t:指定要保存的表的名称. 实例 ...
- 78.pipe多管道云端,客户端通信
压力测试截图: 云端 定义管道缓存区大小,最多连接数量(线程个数),当前线程个数,管道名字 //缓冲区大小 #define SIZE 4096 //最多连接数量 #define MAX_CONNECT ...
- Linux下基于LDAP统一用户认证的研究
Linux下基于LDAP统一用户认证的研究 本文出自 "李晨光原创技术博客" 博客,谢绝转载!
- itchat转发指定的微信群里某个用户的发言到指定的群
复读机功能, 如果有比较多的用户,超出500人,那就得分开至少两个群,如何把一些消息自动复制到另一个群呢. 自动转发指定用户的发言,转发到别的群 # !/usr/bin/env python # -* ...
- vue.js提交按钮时简单的if判断表达式示例
简单的业务需求如下,看图说话 1:当充值金额没有填写的时候,会有Toast小弹框提示"请输入有效的充值金额" if (!this.money) { console.log('mon ...
- 关于java中String的一点理解
String类是java的最基本类之中的一个,非常好的掌握它的原理非常是必要的! 1.String的Final类型的.是不可继承 的.final类默认的方法都为final类型,保证了方法不能被 ...
- Moodle 中文 API 之 文件管理API
File API 文件管理 文件夹 1. 概述 2. 文件域 2.1 命名文件域 3. 提供文件给用户 4. 从用户那获取文件 5. 样例 5.1 浏览文件 5.2 移动文件 5.3 文件列表 5. ...