Effective java经验之谈,创建和销毁对象

关于Effective java 这本书,自己的一些总结性的思考。篇幅可能不按照目录来,因为自己喜欢先看哪一章就直接阅读了。不过能确定的是,每一章都会有总结。欢迎大家拍砖与补充。

1.      考虑用静态工厂的方法代替构造器。优点:有名字,不必每次创建对象,返回任何子类型对象,简洁的代码。缺点:该类将不能被子类化(复合大于继承,也是优点),不方便doc工具输出文档,一般约定的命名规则:

valueOf  转换类型

getInstance 获得对象实例

newInstance 创建新的对象实例

getType 获得返回对象的类型

newType 置入返回对象的类型,在不同类中方便区别工厂方法

2.       遇到多个构造器参数(4个以上)时要考虑用构建器。重叠构造器代码冗长,后期不能有效的维护,javaBean模式的构造器在多线程下不安全,没有达到类不可变性,原因是暴露出去了setter方法。Builder模式的构造器是不错的选择。

Class A{

//属性

static class Bulid{

//属性

Bulid(){//接受初始化参数 }

Bulid a(){ Return bulid; //添加参数返回Bulid产生调用链}

..

A bulid(){ return A(this);} //构造器对象初始化A对象返回

}

A(Bulid b){ //将b中参数传递给A参数域}

}

3.       用私有构造器或者枚举类型强化Singleton属性。对于私有构造器有2种方案,导出公有的静态成员的实例与提供静态工厂返回私有的静态成员实例。但是并非安全的,采用AccessibleObject,通过反射技术可以调用私有的构造器,产生第二对象,解决方案是产生第二实例的时候抛出异常。使得Singleton序列化,(implementsSerializble)+(实例域transient)+(readResolve方法返回实例)。单元素的枚举类型是实现Singleton的最佳方案。

4.       通过私有构造器强化不可实例的能力。提供显示的构造方法比编译器提供默认的好,特别是私有的构造器,并在私有的构造器中抛出AssertionError。由于这一技术的使用,使得该类无法被子类化。

5.       避免创建不必要的对象。考虑的方向有,字符串类,static{}域,视图view(Map中的set等),自动装箱拆箱,对象池object pool。

6.      消除过期的对象引用。Stack.pop后,不使用的元素未置空引起的内存泄露,磁盘交换,严重的情况导致OOM异常。内存泄露另一个来源是缓存问题。如果key中不在保持引用,那么WeakHashMap自动清除过期的key。如果随着时间的增长,某些key可能不用了,那么采用LinkedHashMap。removeEldestEntry方法将实现这一方案。第三个来源是监听器和其他回调,采用保持弱引用的方法,即WeakHashMap的方案来处理。关于内存泄露的一个Heap剖析工具Heap
Profiler。

7.      避免使用终结方法。Finalizer的方法JVM并不一定执行,即使调用了System.gc。System.runFinalization。除非使用System.runFinalizersOnExit,Runtime.runFinalizersOnExit方法(ThreadStop,不建议使用)。尝试着使用try{}finally{}结构来显示的调用终结方法确保及时终止。如果子类覆盖了超类的终结方法,但是忘记手工调用超类的终结方法super.finalize,那么超类的终结方法将永远也不会被调用。

如果将本章内容联系到实际的编码之中呢?我也进行的思考,由于自己在类库方面开发经验很少,没有通读过jdk全部的源码,所以有些建议不一定准确。

1.当你在创建类的时候,就应当想这个类未来要做什么?是什么类型?构造参数多吗?适用经验1,2,3,4

2.当你在编写某段代码的时候,你应当想到该对象是否可以重复利用?如果是集合类,那么思考,传入的对象是否未来会不使用?如果觉得这段代码或者方法,以及涉及到该类在全局上随着运行会消耗较大的内存?那么可以尝试着使用5,6,7三个总结来处理这种问题。

毕竟上面都是一些方法论,在实践过程中,需要自己有经验的去判断如何做才是最优的(可能是目前最优,亦或者未来效果很好),这些都是不同场景下产生的,并不一定会有效的去解决。

时间: 2024-12-29 12:52:50

Effective java经验之谈,创建和销毁对象的相关文章

Effective Java:创建和销毁对象

前言: 读这本书第1条规则的时候就感觉到这是一本很好的书,可以把我们的Java功底提升一个档次,我还是比较推荐的.本博客是针对<Effective Java>这本书第2章所写的一篇读书笔记.博客中也有会一些个人对某个模块的理解和深入探究,希望与大家一起进步. 概述: 本章的主题是创建和销毁对象:何时以及如何创建对象,何时以及如何避免创建对象,如何确保它们能够适时地销毁,以及如何管理对象销毁之前必须进行的各种清理动作. 相关内容: 1.考虑用静态工厂方法代替构造器 思路解析: 如果有人问你,如何

【Effective Java】创建和销毁对象

一.考虑用静态工厂方法代替构造器 构造器是创建一个对象实例的最基本最常用的方法.开发者在使用某个类的时候,通常会使用new一个构造器来实现,其实也有其他方式可以实现的,如利用发射机制.这里主要说的是通过静态类工厂的方式来创建class的实例,如: public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 静态工厂方法和构造器不同有以下主要优势: 1.有意义的名称. 可能有多个构造器,

【读书笔记】《Effective Java》——创建和销毁对象

Item 1. 考虑用静态工厂方法替代构造器 获得一个类的实例时我们都会采取一个公有的构造器.Foo x = new Foo(): 同时我们应该掌握另一种方法就是静态工厂方法(static factory method). 一句话总结,静态工厂方法其实就是一个返回类的实例的静态方法. 书中给出的例子是Boolean的valueOf方法: 通过valueOf方法将boolean基本类型转换成了一个Boolean类型,返回了一个新的对象引用. 除valueOf外,像Java中的getInstance

Java进阶 创建和销毁对象

最近准备写点Javase的东西,希望可以帮助大家写出更好的代码. 1.给不可实例化的类提供私有构造器 比如:每个项目中都有很多工具类,提供了很多static类型的方法供大家使用,谁也不希望看到下面的代码: TextUtils textUtils = new TextUtils(); if(textUtils.isDigitsOnly("123")) { //doSometing }else { //doSomething } 自己写个工具类,总有人喜欢先初始化个实例在调用方法,然后还附

Effective Java 读书笔记(2创建和销毁对象)

第一章是引言,所以这里不做笔记,总结一下书中第一章的主要内容是向我们解释了这本书所做的事情:指导Java程序员如何编写出清晰.正确.可用.健壮.灵活和可维护的程序. 2.1考虑用静态工厂方法代替构造器 静态工厂方法与构造器相比有四大优势: (1)静态工厂方法有名称,具有适当名称的静态工厂方法易于使用.易于阅读: (2)不必每次在调用它们的时候都创建一个新的对象: (3)可以返回原返回类型的任何子类型的对象: (4)在创建参数化类型实例的时候,它们使代码变得更加简洁. 同时静态工厂方法也有两大缺点

effective java读书笔记1——创建和销毁对象

今天刚开始读effective java,中文版的读起来很拗口,但感觉收获很多. 另外,这本书的内容是针对Java 1.5和1.6的. 在这里整理一下第2章:创建和销毁对象 的内容. 第一条:考虑用静态工厂方法代替构造器 这一条针对的情景是要获得类的实例时.一般说来,想要获得类的实例,都是通过构造函数(书里叫做构造器). 最常见的构造函数是这样的,没有返回参数,名字和类名相同. public class A{ public A(int a){ //构造函数内容 ... } } 而所谓的静态工厂,

[Effective Java]第二章 创建和销毁对象

第一章      前言 略... 第二章      创建和销毁对象 1.            考虑用静态工厂方法代替构造器 创建对象方法:一是最常用的公有构造器,二是静态工厂方法.下面是一个Boolean的简单示例: public static Boolean valueOf(boolean b) { return (b ? Boolean.TRUE : Boolean.FALSE); } l  静态工厂方法与构造器不同的第一大优势在于,它们有名称. 作用不同的公有构造器只能通过参数来区别(因

[Effective Java 读书笔记] 第二章 创建和销毁对象 第一条

第二章  创建和销毁对象 第一条 使用静态工厂方法替代构造器,原因: 静态工厂方法可以有不同的名字,也就是说,构造器只能通过参数的不同来区分不同的目的,静态工厂在名字上就能表达不同的目的 静态工厂方法不用每次调用的时候都创建新的对象(其实是因为它是static的,所以只能用static的,所以是一早就创建了,不需要重复创建吧..),比如书中 Boolean.valueOf(boolean) 1 public static final Boolean TRUE = new Boolean(true

《Effect Java》学习笔记1———创建和销毁对象

第二章 创建和销毁对象 1.考虑用静态工厂方法代替构造器 优势: 1.有名称 2.不必在每次调用它们的时候都创建一个新的对象:   3.可以返回原返回类型的任何子类型的对象: JDBC(Java Database Connectivity) 服务提供者框架(Service Provider Framework) 服务接口.提供者注册API.服务访问API.服务提供者接口(负责创建其服务实现的实例): 4.在创建参数类型实例的对象,它们使代码变得更加简洁 2.遇到多个构造器参数时,要考虑使用构造器

【总结】Effective java经验之谈,类与接口

转载请注明出处:http://blog.csdn.NET/supera_li/article/details/44940563 Effective Java系列 1.Effective java经验之谈,创建和销毁对象 2.Effective java经验之谈,泛型 3.Effective java经验之谈,类与接口 4.Effective java经验之谈,通用方法 5.Effective java经验之谈,枚举,注解,方法,通用设计,异常 6.Effective java经验之谈,并发编程