《Effect Java》学习笔记1———创建和销毁对象
第二章 创建和销毁对象
1.考虑用静态工厂方法代替构造器
四大优势:
i. 有名称
ii. 不必在每次调用它们的时候都创建一个新的对象;
iii. 可以返回原返回类型的任何子类型的对象;
JDBC(Java Database Connectivity)
服务提供者框架(Service Provider Framework)
服务接口、提供者注册API、服务访问API、服务提供者接口(负责创建其服务实现的实例);
iv. 在创建参数类型实例的对象,它们使代码变得更加简洁
下面是一个Boolean(基本类型boolean的包装类)的基本实现:
- public static Boolean valueOf(boolean b) {
- return b ? Boolean.TURE : Boolean.FALSE;
- }
美中不足处:
① 类如果不会含公有的或者受保护的构造器,就不能被子类化
② 与其他的静态方法实际上没有区别
常用的名称:
valueOf of getInstance newInstance getType newType
2.遇到多个构造器参数时,要考虑使用构造器
class.newInstance 破坏了编译时的异常检查(Builder弥补不足)
总:如果类的构造器或静态工厂中具有多个参数,考虑用Builder模式;
下面是示例:
- //Builder Pattern
- public class NutritionFacts
- {
- private final int servingSize;
- private final int servings;
- private final int calories;
- private final int fat;
- private final int sodium;
- private final int carbohydrate;
- public static class Builder
- {
- //Required parameters
- private final int servingSize;
- private final int servings;
- //Optional parameters - initialized to default values
- private int calories = 0;
- private int fat = 0;
- private int carbohydrate = 0;
- private int sodium = 0;
- public Builder(int servingSize, int servings)
- {
- this.servingSize = servingSize;
- this.servings = servings;
- }
- public Builder calories(int val)
- { calories = val; return this; }
- public Builder fat(int val)
- { fat = val; return this; }
- public Builder carbohydrate(int val)
- { carbohydrate = val; return this; }
- public NutritionFacts build() {
- return new NutritionFacts(this);
- }
- }
- private NutritionFacts(Builder builder) {
- servingSize = builder.servingSize;
- servings = builder.servings;
- calories = builder.calories;
- }
- }
3.用私有构造器或者枚举类型强化Singleton属性
单元素的枚举类型已经成为实现Singleton的最佳方法
实现方式一:公有静态成员是一个final域
- //Singleton with public final field
- public class Elvis {
- public static final Elvis INSTANCE = new Elvis();
- private Elvis() {......}
- public void leaveTheBuilding() {......}
- }
实现方式二: 公有的成员是个静态工厂方法
- //Singleton with static factory
- public class Elvis {
- private static final Elvis INSTANCE = new Elvis();
- private Elvis() {......}
- public static Elvis getInstance() { return INSTANCE;}
- public void leaveTheBuilding() {......}
- }
实现方式三(最佳实现方式):
只需编写一个包含单个元素的枚举类型;
这种方法在功能上与公有域方法相近,当是它更加简洁,无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。
- //Enum singleton - the preferred approach
- public enum Elvis {
- INSTANCE;
- public void leaveTheBuilding() {......}
- }
4.通过私有化构造器强化不可实例化的能力
throw new AssertionError(); (构造器内)
可在上面加入注释,便于理解,如下:
suppress default coustructor for noninstratiability.
示例如下:
- //Noinstantialbe utility class
- public class UtilityClass {
- //Suppress default constructor for noninstiability
- private UtilityClass() {
- throw new AssertionError();
- }
- ...... //Remainder omitted
- }
5.避免创建不必要的对象
update。。。。
《Effect Java》学习笔记1———创建和销毁对象的更多相关文章
- Effective Java 学习笔记之创建和销毁对象
一.考虑用静态工厂方法代替构造器 1.此处的静态工厂方法是指返回指为类的对象的静态方法,而不是设计模式中的静态工厂方法. 2.静态工厂方法的优势有: a.使用不同的方法名称可显著地表明两个静态工厂方法 ...
- 【Effective Java读书笔记】创建和销毁对象(一):考虑使用静态工厂方法代替构造器
类可以提供一个静态方法,返回类的一个静态实例,如Boolean包装类的一个获取实例的静态方法 public static Boolean valueOf(boolean b) { return (b ...
- Effective Java 读书笔记之一 创建和销毁对象
一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- Effective Java(1)-创建和销毁对象
Effective Java(1)-创建和销毁对象
- effective java 第2章-创建和销毁对象 读书笔记
背景 去年就把这本javaer必读书--effective java中文版第二版 读完了,第一遍感觉比较肤浅,今年打算开始第二遍,顺便做一下笔记,后续会持续更新. 1.考虑用静态工厂方法替代构造器 优 ...
- 0036 Java学习笔记-多线程-创建线程的三种方式
创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...
- 《Effective Java》读书笔记 - 2.创建和销毁对象
Chapter 2 Creating and Destroying Objects item 1:Consider static factory methods instead of construc ...
随机推荐
- new 的用法
在C#中,new关键字有三种用法: 1.new 运算符,用于创建对象和调用构造函数. 2.new 修饰符,在用作修饰符时,new关键字可以显式隐藏从基类继承的成员. 3.new 约束 ,用于在泛型 ...
- SDUT 1570 C 旅行(DFS)
点我看题目 题意 : 中文不详述. 思路 :就是DFS一下,只要到达终点条数就加1,然后再注意一下方向,因为我就是没注意方向WA了,只能向上向右走,x是行,所以向上是x-1,向右是y+1,因为我没弄好 ...
- Motion on Ubuntu
Motion is a program that monitors the video signal from one or more cameras and is able to detect if ...
- 基于ASP.NET的comet简单实现 http长连接,IAsyncResult
http://www.cnblogs.com/hanxianlong/archive/2010/04/27/1722018.html 我潜水很多年,今天忽然出现.很久没写过博客了,不是因为不想写,而是 ...
- delphi中formatFloat代码初探(在qt下实现floatformat的函数)
由于项目需要,需要在qt下实现floatformat的函数.之前写过一个,但是写得不好.决定重新写一个,参考delphi xe2下的实现.把xe2下的相关代码都看了一遍,xe2的代码思路在这里贴出来. ...
- 文件过滤驱动实现目录重定向(一)good
文件过滤驱动拦截的IRP主要包括以下几个:IRP_MJ_CREATE,文件创建操作,文件的任何操作,都是从这里开始的.IRP_MJ_CLEANUP,文件的HANDLE句柄全部关闭会触发这个消息IRP_ ...
- Android开发中一些被冷落但却很有用的类和方法
MediaMetadataRetriever 顾名思义,就是用来获取媒体文件一些相关信息的类.包括一首歌的标题,作者,专辑封面和名称,时长,比特率等等.如果是视频的话,可以获取视频的长宽,预览图. h ...
- GC回收建议
1.最基本的建议就是尽早释放无用对象的引用.大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域(scope)后,自动设置为 null.我们在使用这种方式时候,必须特别注意一些复杂的对象图,例 ...
- mingw32 下编译 zlib
cp win32/makefile.gcc makefile.gcc make -f makefile.gcc make install -f Makefile.gcc INCLUDE_PATH=/m ...
- hadoop异常:java.lang.RuntimeException: java.lang.NoSuchMethodException
出现异常的程序大致框架是这样的: public class getMaxTemperature extends Configured implements Tool { ... class MaxTe ...