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实现会将它们优化掉。
引用
异常永远不应该被用于正常的控制流
分享到:
相关推荐
《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...
《Effective Java》是Java开发领域的经典著作,由Joshua Bloch编写,旨在提供一系列实用的编程准则和最佳实践。这本书的第三版包含了大量更新,涵盖了Java语言和平台的新发展,如Java 8和Java 9的新特性。以下是对...
《Effective Java》是Java...以上仅是《Effective Java》一书中部分核心知识点的概述,实际的读书笔记中会更详细地解释这些概念,并给出具体的示例代码。通过深入学习和实践,开发者可以极大地提升其Java编程的水平。
【Java入门级学习笔记】 ...总之,Java学习笔记旨在为初学者提供全面的学习路径,从基础知识到核心概念,再到实际应用,逐步构建扎实的Java编程基础。通过持续学习和实践,你可以逐渐掌握这门强大且多用途的语言。
读书笔记:Effective Java中文版学习项目
《Effective Java》是一本经典Java编程指南,作者是Joshua Bloch,这本书深入探讨了如何编写高质量、高效、可维护的Java代码。以下是对压缩包中各章节主要知识点的详细阐述: 1. **第2章 创建和销毁对象** - 单例...
以下是一些关于Java学习书籍的知识点,这些书籍可以帮助你从入门到精通,全面提升你的Java编程技能。 1. **《Java核心技术卷》**:这套书籍通常分为两卷,卷I主要涵盖基础知识,如语法、数据类型、控制结构、类和...
这些书籍结合使用,将提供一个全面且深入的Java学习路径。从基础到高级,从理论到实践,逐步建立起扎实的Java编程技能。同时,附带的示例代码将帮助读者更好地理解和应用所学知识,通过实践来深化理解。记住,学习...
本资源集合提供了一份完整的“Java学习PDF”,旨在帮助学习者系统地理解和掌握Java编程。 这份PDF教程可能涵盖以下关键知识点: 1. **Java简介**:介绍Java的历史、特点、应用领域以及与其它编程语言的对比,使...
Java学习笔记 Effective Java Topic2:插件销毁对象 2. 多参数情况 使用重叠构造器; 使用Build模式【构建器】: new A.Build().set.set.build(); Build模式也适用于类层次结构 递归类型参数 /* * 递归类型参数: ...
2. **2018年黑马程序员最新Java学习笔记**:这份笔记是由专业教师精心整理的,包含济南校区的精华教学内容,不仅覆盖了基础理论,还有实践案例,是学习过程中的重要参考资料。链接:...
Structure /src/main/java ... ├ effective_java Effective Java 中文第二版 ├ jvm 深入理解Java虚拟机:JVM高级特性与最佳实践 ├ lambda JAVA 8实战 ├ netty Netty权威指南 ├ oop ├ recursion
* CS-Notes:Java学习笔记,涵盖了Java的基础知识、数据结构、算法、设计模式等。 * advanced-java:Java高级教程,涵盖了Java的高级知识、Java设计模式、Java框架和工具等。 Java实战 * miaosha:Java电商项目,...
比如Awesome Java集合了各种Java资源,Java-Interview提供了面试准备资料,JDK源码阅读笔记帮助理解Java内部机制,Java设计模式实现则涵盖了各种设计原则,而Java学习笔记提供了从JavaSE到JavaWeb的逐步学习路径。...
对于学习 drools 的初学者,理解这些基础概念至关重要,它们将帮助你构建复杂的规则系统,实现业务逻辑的自动化和智能化。在实际应用中,根据需求灵活运用这些特性,可以极大地提升软件系统的可维护性和扩展性。
### Java学习心得 #### 1. 沉稳心态 浮躁的心态永远无法成为真正的高手。在学习Java的过程中,首先需要调整自己的心态,保持平和、冷静的状态。不要急于求成,也不要因为一时的挫折而放弃。记住,真正的高手是在...
学习JAVA是一种深度探索的过程,它不仅要求我们掌握基础语法,还需要理解其...学习多元化的编程语言和文化,可以拓宽视野,使你在JAVA学习的道路上更加游刃有余。通过这些方法,相信你可以成为一名出色的JAVA开发者。
### Maven 2 学习笔记 #### 一、Maven 项目的基本结构及创建 Maven使用特定的目录结构来组织项目文件,通过`mvn archetype:create`命令可以快速创建项目模板。例如: ```shell mvn archetype:create -DgroupId=...
loveincode's notes 学习工作中的一些记录,收藏。 操作系统 , 编译原理 , 计算机网络 , 互联网协议... 常用数据结构与算法 Java 实现 数据结构 与 排序算法 ...Effective Java , HTTP权威指南 , Java
这份"java面试大全(题库、源码、书籍、笔记、简历模板).zip"资源集合提供了一个全方位的学习和复习平台,帮助你提升Java技能并顺利通过面试。 首先,题库部分包含了Java基础、进阶、框架、设计模式等多方面的面试...