`
angie_hawk7
  • 浏览: 47003 次
  • 性别: Icon_minigender_1
  • 来自: 乌托邦
社区版块
存档分类
最新评论

Effective java学习笔记(一)

阅读更多
1:使用私有构造函数强化singleton属性
实现singleton有两种方法,这两种方法都要把构造函数保持为私有,并且提供一个静态成员,以便允许客户能够访问该类唯一的实例
private static final SingletonTest instance = new SingletonTest(); 
private SingletonTest() {   
        System.out.println("SingletonTest Constructor...");   
}

public static SingletonTest getInstance() {     
        return SingletonCreate.instance;     
}

2:改写equals时总是要改写hashCode
在每个改写了equals方法的类中必须要改写hashCode方法。如果不这样做,就会违反object.hashCode的通用约定,从而导致该类无法与基于散列值(hash)的集合类结合在一起正常运作,这样的集合类包括HashMap,HashSet,Hashtable。

1:在一个应用程序期间,如果一个对象的equals方法作比较所用到的信息没有被修改的话,那么,对该对象调用hashCode方法多次,它必须始终如一返回同一个整数。在同一个应用程序的多次执行过程中,这个整数可以不同,即这个应用程序这次执行返回的整数与下一次执行返回的整数可以不一致。
2:如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中的任何一个对象的hashCode方法必须产生同样的整数结果。
3:如果两个对象根据equals(Object)方法是不想等的,那么调用这两个对象中任一个对象的hashCode方法,不要求必须产生不同的整数结果。
private final short areaCode;
	private final short exchange;
	private final short extension;
	
	public HashCodeTest(int areaCode,int exchange,int extension){
		rangeCheck(areaCode, 999, "area code");
		rangeCheck(exchange, 999, "exchange");
		rangeCheck(extension, 9999, "extension");
		this.areaCode=(short)areaCode;
		this.exchange=(short)exchange;
		this.extension=(short)extension;
	}
	
	private static void rangeCheck(int arg,int max,String name){
		if(arg<0 || arg> max)
			throw new IllegalArgumentException(name+";"+arg);
	}
public static void main(String[] args) {
	Map m=new HashMap();
	m.put(new HashCodeTest(408,867,5309), "hawk7");
	System.out.println(m.get(new HashCodeTest(408,867,5309)));
	System.out.println(new HashCodeTest(408,867,5309).equals(new 							HashCodeTest(408,867,5309)));
	}

在没有实现equals和hashCode方法时一个返回null,另一个返回false
实现equalse方法没实现hashCode方法 返回null和true;
两个都是先返回hawk7和true;
引用
如果只需要关心域中的值是否相等,则需要实现equals方法,同时必须实现hashCode方法

3:总是要改写toString方法,可借助工具类,例如:
public String toString() {   
        ToStringBuilder builder = new ToStringBuilder(this);   
        builder.append("id", id).append("name", name);   
        return builder.toString();   
}  

4:使类和成员的可访问能力最小化
应该尽可能的使每一个类或者成员不被外界访问
5:复合优先于继承
只有当子类和超类之间确实存在了子类型关系时,使用继承才是恰当的,如果子类和超类在不同的包中,而且包类并不是为扩展而设计,那么就该使用复合或者转发机制代替继承
6:接口只是被用于定义类型
当一个类实现了一个接口的时候,这个接口被用作一个类型(type),通过此类型可以引用这个类的实例,因此一个类实现了一个接口就表明客户可以对这个类的实例进行某些动作,为了任何其它目的而定义接口是不合适的
引用
常量接口模式是对接口的不良使用

7:检查参数的有效性
对于公有的方法使用javadoc @throws标签tag可以是文档中记录下"一旦针对参数值的限制被违反之后 将会抛出的异常"
	public BigInteger getAAA(BigInteger x){
		if(x.signum()<=0)
			throw new ArithmeticException();
	}

非公有的方法通常应该使用断言(assertions)来检测它们的参数,而不使用正常的检查语句
8:不要追求提供便利的方法:每一个方法应该提供其应具备的功能点
9:避免太长的参数列表
10:参数类型优先使用接口而不是类
例如:没有理由编写一个方法时使用hashMap作为输入,应该使用map
11:返回0长度的数组而不是null
12:如果要求精确的答案,请避免使用float和double。
eg:
System.out.println(1.03-.42);

输出:
0.6100000000000001

正确的办法应该是使用BigDecimal,int,long。
如果是希望系统处理十进制小数点,并且不介意因为不使用原语类型而带来的不便,那么就是用BigDecimal。使用BigDecimal允许你完全控制舍入。如果性能十分关键,自己又不愿意去处理十进制小数点,而且送涉及的数字又不是很大,则使用int或者long.如果数值范围没有超过9位十进制数,则使用int.如果不超过18位数字,则可以使用long。如果数值范围超过了18位,则就必须使用BigDecimal。
13:只有针对不正常的条件才使用异常。
eg:
try{
			int i=0;
			while(true)
				a[i++].f();
		}catch(ArrayIndexOutOfBoundsException e){
			
		}

for(int i=0;i<a.length;i++){
			a[i].f();
		}

有人会优先使用基于异常的模式,这其实被误导了。他们企图利用java的错误判断机制来提高性能。因为JVM对数组的每次访问都要检查是否越界,所以他们认为循环终止测试时多余的。这种想法是错误的。必须认识到如下:
异常机制的设计初衷是用于不正常的情形,很少会有JVM实现试图对他们的性能做优化。所以创建,抛出,和捕获异常的开销是昂贵的。
对数组进行遍历的标准模式并不会导致冗余的检查,有些现代的JVM实现会将它们优化掉。
引用
异常永远不应该被用于正常的控制流
分享到:
评论
1 楼 shawnccx 2010-09-16  
非常不错,学习了,期待LZ的后续

相关推荐

    effective java 读书笔记

    effective java 读书笔记,第二版自己摘要并翻译,以备速查。

    java7hashmap源码-for-java:java学习笔记

    Java学习笔记 Effective Java Topic2:插件销毁对象 2. 多参数情况 使用重叠构造器; 使用Build模式【构建器】: new A.Build().set.set.build(); Build模式也适用于类层次结构 递归类型参数 /* * 递归类型参数: ...

    java-note:Java学习笔记

    Structure /src/main/java ... ├ effective_java Effective Java 中文第二版 ├ jvm 深入理解Java虚拟机:JVM高级特性与最佳实践 ├ lambda JAVA 8实战 ├ netty Netty权威指南 ├ oop ├ recursion

    5本java学习用书

    找了5本学习java的好书和一些例子代码和大家分享,希望能够对您能有所帮助。

    notes:JavaJava后端工程师的学习笔记https

    loveincode's notes 学习工作中的一些记录,收藏。 操作系统 , 编译原理 , 计算机网络 , 互联网协议... 常用数据结构与算法 Java 实现 数据结构 与 排序算法 ...Effective Java , HTTP权威指南 , Java

    leetcode题库-MyNote:`13的学习笔记

    的学习笔记 学习笔记与练习项目源码整理 The Only Easy Day Was Yesterday 编程语言 C 参考书籍 : 《c primer plus》 6th edition 书内习题答案总结 , 优秀源码赏析 快速平方根算法 kilo (1000行的源文本编辑器) ...

    java8源码-esmusssein777.github.io:我的学习记录

    java8 源码 Spring IoC源码 effectiveJava学习笔记 Java8的实战学习笔记

    高级java笔试题-Lookoop:学习笔记

    高级java笔试题 个人博客 c++ c++primer - c++primer顺序容器与关联容器的一些用法 effective c++ - effective c++笔记归纳 Data Structures and Algorithm Analysis 数据结构与一些算法,来自算法导论,数据结构与...

    Android代码-一个集Gank.Io,Rxjava示例,操作符,MD控件使用,各种好玩Ap示例的学习App。

    安卓艺术开发探索读书笔记,EffectiveJava读书笔记. 收集各大神博客以及安卓笔记,安卓面试笔记等方便手机端查看. 更新说明 v2.2.2 1.增加了一些最近在学习比较好的安卓大神的博客. 2.增加了来自GeniusVJR整理的安卓...

    java软件笔试题-MyNotebook:我大学时期的笔记本

    机器学习 C++笔记 part 4: 数据结构与算法 part 5: 笔试/面试 part 6:专业基础 输入URL到页面加载完成的过程 part 7:读书笔记 thinking in java effective java Android开发艺术探索 Android插件化开发指南

    AndroidRank 干货学习客户端

    作者HotBitmapGG,源码StudyProject,一款 Material Design 风格的 AndroidRank 干货学习客户端,需要...安卓艺术开发探索读书笔记,EffectiveJava 读书笔记. 收集各大神博客以及安卓笔记,安卓面试笔记等方便手机端查看.

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

Global site tag (gtag.js) - Google Analytics