- 浏览: 131498 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
jingjieyiman:
引用
[url][/url][flash=200,200][ ...
Java 学习入门到高深 -
Technoboy:
...
AOP 的利器:ASM 3.0 介绍 -
kingkan:
非常支持,我有意愿加入。。。如果可以,请给我短消息,je我每天 ...
【征集】做一个管理人际关系的应用 -
夜之son:
csuzm0613 写道能否直接做成Android应用程序呢? ...
【征集】做一个管理人际关系的应用 -
gdwrx_winson:
谢谢异常哥的回复,目前的想法是做成一个web应用抛出异常的爱 ...
【征集】做一个管理人际关系的应用
避免创建重复的对象
面向范围:非可变的对象、已知不会被修改的可变对象
用法:如果有静态工厂方法----静态工厂方法。
在静态区域初始化---将一些对象改成static
适配器(adapter)/视图(view):把功能委托给后面的一个对象,从而为后面的对象提供一个可选的接口的对象。针对某个给定对象的特定适配器而言,不需要创建多个适配器实例。Map接口的keySet方法不是每次返回都创建一个新的Set实例。
数据库连接池的使用
注意:小对象一般采取创建新的对象,大的对象才采取重用。
避免使用终结函数
原因:终结函数(finalizer)是不可预测,危险的,一般情况下不必要。会导致不稳定行为、更差的性能,以及移植性问题。
终结函数不能保证会被及时地执行,执行时间点依赖与JVM的实现。
System.gc和System.runFinalization只是增加终结函数被执行的机会。
如果一种未被捕获的异常会在终结过程中被抛出来,那么这种异常就被忽略了,同时这个对象已经被破坏却不通知其他线程(对象)
提供一个显式的终止方法。如close或cancel,结合try-finally结构使用。
好处:当一个对象的所有者忘记了调用显式终止方法的情况下,终结函数可以充当“安全网”。
在本地对等体不拥有关键资源的前提下,终结函数是最合适的。----本地对象,普通对象通过本地方法委托给一个本地对象,在普通对象回收的时候,垃圾回收器不知道普通对等体。
注意:终结函数链不会被自动执行---需要手工调用超类的终结函数(结合try-finally)
终结函数守卫者----把终结函数不是放在要求处理的类中,而是放在匿名类中,该匿名类的唯一用途就是终结其外围实例。当守卫者被终结的时候,它执行外围实例所期望的终结行为。
改写equals时总要改写hashCode
原因:导致该类无法与所有基于散列值的集合类结合在一起正常运作。(HashMap、HashSet、Hashtable)
规范:在一个应用程序执行期间,对象调用hashCode方法多次,必须始终返回同一个整数。
如果两个对象根据equals(Object)是相等的,那么这两个对象调用hashCode都返回同一个整数。
如果两个对象根据equals(Object)是不相等的,那么这两个对象调用hashCode不要求返回不同整数。但返回不同整数可以提高散列表性能。
散列函数的建议:将各个域组织起来形成一个表达式
如果类是非可变的,且计算散列码代价比较大,可以考虑把散列码缓存在对象内部。
private volatile int hashCode = 0;
public int hashCode() {
if(hashCode == 0) {//生成新的散列码}
}
谨慎地改写clone
Cloneable做了什么?---如果一个类实现了Cloneable,则Object的clone方法返回该对象的逐域拷贝,否则的话抛出CloneNotSupportedException异常。
规范:对任何对象x
x.clone() != x
x.clone().getClass() == x.getClass()
x.clone().equals(x)
都为true。
注意:clone是浅复制的,可以通过建立类似于自动的构造函数链的方式最终递归到Object的clone。---要求一系列的父类都要实现clone。
可以在clone里面自己创建新的对象赋值---与final域产生冲突。
所有实现Cloneable接口的类都应该用一个公有的方法改写clone。此公有方法首先调用super.clone,然后修正任何需要修改的域。
替代方案:拷贝构造函数
public A(A a);
静态工厂代替构造函数
public static A newInstance(A a);
考虑实现Comparable接口
java.lang.Comparable接口唯一方法:compareTo()---允许进行简单的相等比较和执行顺序比较。
实现Comparable接口,表明它的实例具有内在的排序关系。
好处:可以跟许多泛型算法以及依赖于该接口的集合实现进行协作。
规范:当该对象小于、等于或者大于指定对象的时候,分别返回一个负整数、零或者正整数。
对称性、传递性
建议:(x.compareTo(y)==0) == (x.equals(y))---BigDecimal类就不符合该建议。
如果想为一个实现了Comparable接口的类增加一个关键特征,不要去扩展这个类,而是编写一个不相关的类,其中包含一个域,其类型为第一个类,然后提供一个视图方法返回这个域。----可以自由地在第二个类上实现compareTo,可以将第二个类的实例当做第一个类的实例看待。
如果一个域没有实现Comparable接口,或者需要使用一个非标准的排序关系---使用显式的Comparator。
依赖于CompareTo比较的类:TreeSet、TreeMap、Collections、Arrays
清除过期的对象引用
过期引用:指永远不会再被解除的引用。
用法:将对象引用赋值null。
重用一个本来已经包含对象引用的变量,后者让这个变量结束其生命周期。---要想引用消失,必须退出包含该变量的方法。
例子:在数组非活动区域存在对对象的引用---垃圾回收器不会自动处理,需要手工将对象引用清空。
将对象遗忘在缓存中---只要在缓存之外存在对某个条目的键的引用,该条目就有意义----使用WeakHashMap代表缓存。
---缓存中条目过期之后自动被删除
---缓存中的条目在运行的过程中变得越来越没有价值----使用LinkedHashMap类的removeEldestEntry方法实现。
注意:清空对象引用是一种例外行为而非一种规范行为。
使用私有构造函数强化singleton属性
定义:指只能实例化一次的类。通常用于代表那些本质上具有唯一性的系统组件。
用法:公有静态成员:
public class A {
public static final A INSTANCE = new A();
private A() {...}
}
公有静态工厂方法:
public class A {
private static final A INSTANCE = new A();
private A() {...}
public static A getInstance() {
return INSTANCE;
}
}
如果确信该类永远是一个singleton,那么使用第一种方法有意义。
如果希望保留一点修改余地,那么使用第二种方法。
注意:为使一个singleton类变成可序列化,仅仅在声明中加上implements Serializable是不够的。为维护singleton性,必须也要提供一个readResolve方法。否则的话,一个序列化的实例在每次反序列话的时候,都会导致创建一个新的实例。
private Object readResolve() throws ObjectStreamException {
return INSTANCE;
}
通过私有构造函数强化不可实例化的能力
定义:提供一个显式的私有构造函数,同时不提供方法生成对象。
用法:public class A {
private A() {}
}
好处:只包含静态方法和静态域的类(工具类)---如java.lang.Math、java.util.Arrays、java.util.Collections
缺点:类不能被子类化---不存在可访问的超类构造函数。
用静态工厂方法代替构造函数
定义:一个静态方法,返回类的一个实例。
用法:public static Boolean valueOf(boolean b) {
return (b ? Boolean.TRUE : Boolean.FALSE);
}
好处:静态工厂方法有名字,便于阅读。绕开一个类只有一个原型相同的构造函数----不同的工厂方法名(如不用静态工厂方法,可以通过参数类型顺序不同来实现多个构造函数)
每次被调用的时候,不要求非得创建新的对象,故对于一些非可变类来说,可以使用一个预先构造好的实例,避免频繁创建相同对象。(好处:singleton、非可变类的equals比较简化成==)
返回类型比较灵活,可以返回原类型的子类型对象。
缺点:类如果不含公有的或者受保护的构造函数,就不能被子类化(被继承)。---使用复合结构而非继承
不是规范----标准命名习惯----valueOf、getInstance
在改写equals的时候请遵守通用约定
原因:Object类的equals只是简单地比较两个对象的引用是否相同。
类需要实现“逻辑相等”概念---超类并没有实现或不适合
一般不用改写的情况:类型安全枚举类型----保证了每一个值至多只存在一个对象。
String
包装类---Integer、Boolean等
改写规范:equals方法实现了等价关系
自反性:x.equals(x)一定为true。
对称性:y.equals(x)为true时,x.equals(y)一定为true。
传递性:x.equals(y)为true,y.equals(z)为true,则x.equals(z)为true。
一致性:多次调用z.equals(y)要么一致地返回true,要么一致返回false。
对任意非空引用值x,x.equals(null)一定返回false。
建议:使用==检查“实参是否为指向对象的同一个引用”---if (this==o) return true;
使用instanceof检查“实参是否为正确的类型”
把实参转换到正确的类型
对类中每一个“关键”域,检查实参中的域与当前对象中对应的域值是否匹配。
检验是否对称、传递、一致的。
注意:改写equals的时候,总要改写hashCode。
不要将equals追求过度的完美等价关系。
不要使equals依赖于不可靠的资源。
不要将equals声明中的Object对象替换为其他类型---那变成了重载而非重写。
总是要改写toString
原因:Object类返回的格式固定为---类名字+@+散列码的无符号十六进制表示。
追求“简洁的,但信息丰富,并且易于阅读的表达形式”。
缺点:如果这个类已经被广泛使用,则一旦指定了格式,必须始终坚持这种格式。不指定格式可以保留灵活性。
发表评论
-
【征集】做一个管理人际关系的应用
2011-03-07 21:10 1167背景:目前人际交往越来越密切,但是同时处理好庞大的人际关系又比 ... -
输入输出流的复制
2010-12-30 09:26 664public static void copy(Inpu ... -
RAD快速开发
2010-12-14 12:28 1328RAD=rapid application develop(快 ... -
TreePath的用法
2010-12-14 10:53 1387TreeSelection sel = (TreeSelect ... -
获取数据库中存储过程名
2010-12-14 10:49 857获取数据库中存储过程名 This example retri ... -
数字输入校验
2010-12-14 10:48 7701. txt_TimeLimit = new T ... -
GMF手动增加一个EditPart需要修改代码
2010-12-14 10:19 974edit: 创建相应的command、helper、edi ... -
Collections
2010-12-14 10:16 1101Collections.unmodifiableSet() ... -
Collections
2010-12-14 10:16 1000Collections.unmodifiableSet() ... -
JMX连接JConsole字符串
2010-12-14 10:13 973service:jmx:iiop:///jndi/corban ... -
Problem视图增加Marker
2010-12-14 10:00 1322首先,需要得到Problems视图窗口: IWorkbenc ... -
SQL数据库类型
2010-12-14 09:59 839SQL Server 2000 Data Types SQL ... -
数据库相关知识
2010-12-14 09:22 730String strurl = "jdbc:o ... -
FileOutputStream
2010-12-10 14:00 1293FileOutputStream可以创建文件,但一般使用new ... -
关于端口被占用
2010-11-12 10:49 825今天整了一下JBoss的ESB,Server启动的时候抛了端口 ... -
好的算法
2010-11-11 20:00 757用数组代替Map---填入过程 public v ... -
Java调试参数
2010-09-28 08:48 3094java -Xdebug -Xrunjdwp:tran ... -
SQL语句
2010-09-26 13:31 691下列语句部分是Mssql语句,不可以在access中使用 ... -
使用Java JDK中Java.net包控制UDP协议
2010-09-26 12:38 878使用Java JDK中Java.net包控制UDP协议 什么 ... -
关于动态调用方法的例子
2010-09-26 12:37 717情况: 一个类中有很多同名方法,名字相同,参数列表不一样。 ...
相关推荐
"Effective Java读书笔记" Effective Java是一本关于Java编程语言的经典书籍,本笔记主要总结了Java语言的发展历程、静态工厂方法的应用、构造器模式的使用等重要知识点。 一、Java语言的发展历程 Java语言的发展...
《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...
以下是对《Effective Java》笔记中可能涉及的关键知识点的详细解读: 1. **单例模式**:书中强调了如何正确实现单例模式,推荐使用`enum`来创建线程安全且唯一的实例,避免传统双重检查锁定的潜在问题。 2. **构造...
Effective Java 读书笔记 - 枚举与注解 本文总结了Effective Java 中关于枚举与注解的知识点,涵盖了枚举类型的优点、使用指南、避免使用 int 常量、使用 EnumSet 和 EnumMap 等。 枚举类型的优点 枚举类型提供了...
《Effective Java》是一本经典Java编程指南,作者是Joshua Bloch,这本书深入探讨了如何编写高质量、高效、可维护的Java代码。以下是对压缩包中各章节主要知识点的详细阐述: 1. **第2章 创建和销毁对象** - 单例...
《Effective Java》是Java...以上仅是《Effective Java》一书中部分核心知识点的概述,实际的读书笔记中会更详细地解释这些概念,并给出具体的示例代码。通过深入学习和实践,开发者可以极大地提升其Java编程的水平。
读书笔记:读Effective Java中文版第3版阅读源码测试案列
读书笔记:Effective Java中文版第3版笔记
读书笔记:Java练习包括《Java编程思想》《算法》《Effective Java》等
读书笔记:Effective Java中文版学习项目
读书笔记:Effective Java中文版第二版示例、笔记
读书笔记:Effective Java中文版 第2版
读书笔记:Effective Java中文版第二版示例代码
读书笔记:Effective Java 中文版(2版和3版)
读书笔记:Effective Java 中文版(第2版)总结 (美)Joshua Bloch 著
### Effective Java读书笔记(上) #### 第一章 引言 本书主要针对Java开发者提供了大量实用的编程指导建议,帮助读者提升代码质量和程序性能。在本章节中,我们将重点介绍对象的创建与销毁,以及一些重要的设计...
读书笔记:Effective.Java中文版(第3版)
“新建文本文档.txt”可能是一个简单的文本文件,用于记录学习过程中的笔记或者资源链接,或者可能是教程中的一部分内容,具体用途需打开文件查看。 总的来说,这份“Java学习PDF”是Java初学者宝贵的参考资料,...
除了课程内容,阅读官方文档、经典教材如《Head First Java》、《Effective Java》等,以及观看开源项目和在线教程,可以帮助巩固理论知识,提升实践能力。 总之,Java学习笔记旨在为初学者提供全面的学习路径,从...