通用程序设计
1:将局部变量的作用域最小化。
(I):要使局部变量的作用于最小化,最有力的方法就是在第一次使用它的地方声明。
(II):几乎每个局部变量的声明都包含一个初始化表达式
2:for-each循环优于传统的for循环
//–>无法使用for-each循环
(I):过滤:如果需要遍历集合,并删除选定的元素,就需要使用显示的迭代器,以便可以调用它的remove方法。
(II):转换:如果需要遍历数组或者列表,并取代它部分或者全部的元素值,就需要列表迭代器或者数组索引,以便设定元素的值。
(III):平行迭代:如果需要并行的遍历多个集合,就需要显示的控制迭代器或者索引变量,以便所有的迭代器或者索引变量都可以得到同步前移。
3:了解和使用类库
(I):集合框架是统一的体系结构,用来表示和操作集合,允许它们对集合进行独立于表示细节的操作。
(II):java.util.concurrent包中增加了一组并发使用工具.这个包既包含高级的并发工具来简化多进程的编程任务,还包含了低级别的并发基本类型,允许编写更高级的并发抽象。
4:如果需要精确的答案,请避免使用float和double
(I):float和double主要是为了科学计算和工程计算而设计的,它们执行二进制浮点运算(binary float-point arithmetic).然而,它们并没有体用完全精确的结果,所以不应该被用于需要精确结果的场合,float和double类型尤其不适于货币计算。
(II):可以使用BigDecimal,int或者long进行货币计算(使用BigDecimal代替double计算,不过很慢)、
(III):如果性能非常关键,并且你有不介意自己记录十进制小数点,而且又
涉及的数值不太大时,可以使用int或者long.如果数值范围没有超过9位十进制数字,可以使用int;如果不超过18数字,可以使用long;如果数值可能超过18位,就必须使用BigDecimal。
5:基本类型优先于装箱基本类型
(I):Java类型系统由两部分组成:包含基本类型(primitive),如int,double..
和引用乐宁(reference type),如String和List等.每个基本类型都有一个对应的引用类型,称为装箱基本类型(boxed primitive).装箱基本类型中对应于int,double和boolean的是Integer,Double,Boolean
(II):区别:
(a):基本类型只有值,而装箱基本类型则又有与它们的值不同的同一性。
(b):基本类型只有功能完备的值,而每个装箱基本类型还有非功能值null
(c):基本类型通常比装箱基本类型更节省时间和空间
(III):什么时候用装箱基本类型:
(a):作为集合中的元素,键和值.你不能把基本类型放在集合中,因此必须使用装箱基本类型。
(b):在参数化类型中,必须使用装箱基本类型作为类型参数,因为Java不允许使用基本类型。
(c):在进行反射的方法调用,必须使用装箱基本类型。
(d):在设计数据库对应的实体类时(即POJO类),应该总是使用包装数类型。
(e): RPC 方法的返回值和参数必须使用包装数据类型。
6:当心字符串连接的性能
(I):如果要连接大规模的字符串,请使用StringBuffer代替String。
(II):不要使用字符串连接操作符来合并多个字符串,除非性能无关紧要.相反,应该使用StringBuilder的append方法。另一种使用字符数组,或者每次只处理一个字符串,而不是将它们组合起来。
7:优先通过接口引用对象
(I):优先使用接口而不是类来引用对象.如果有合适的接口类型存在,
那么对于参数,返回值,变量和域来说,就都应该使用接口类型进行声明.
只有当你利用构造器创建某个对象的时候,才真正需要引用这个对象的类.
例如:
Vector<Person> persons = new Vector<>();
//not priority to suggest to use
List<Person> persons1 = new Vector<>();
//priority to suggest to use
这样一来,你的程序会更加的灵活.
(II):值类很少会用对个实现编写,它们通常是final的,并且很少有对应的接口.使用这种值类作为参数,变量,域或者返回类型是在合适不过来.
//不存在适当接口类型
(III):对象属于一个框架,而框架的基本类型是类,不是接口.如果对象属于
这种基于类的框架(class-based framework),就应该用相关的基类(往往是抽象类)来引用这个对象,而不是用它的实现类.
(IIII):类实现了接口,但是它提供了接口中不在的额外方法—例如LinkedHashMap.如果程序依赖于这些额外的方法,这种类就应该只是被用来引用它的实例,它很少应该被用作参数类型.
8:接口优先于反射
(I):丧失了编译时的类型检查的好处;执行反射访问需要的代码非常笨拙和冗长;性能损失
(II):核心反射机制最初是为了基于组件的应用创建工具而设计的.这类工具通常要根据需要装载类,并且用反射功能找出他们支持哪些方法和构造器.这些工具允许用户交互式的构建出访问这些类的应用程序,但是所产生出来这些应用程序能够以正常的方式访问这些类,而不是反射的方式.反射功能真是在设计时用到,通常,普通应用程序在运行时不应该以反射的方式访问对象.例如用到反射的应用程序:类浏览器,对象监视器,代码分析工具,解释型的内嵌式系统.在RPC系统中使用反射机制也是非常合适的.
9:遵守普遍接受的命名惯例
(I):类和接口的名称,包括枚举和注解类型的名称,都应该包括一个或者多个
单词,每个单词的首字母大写.应该避免缩写,除非是一些首字母缩写和一些
通用的缩写,例如max和min。
(II):方法和域的名称和类和接口的名称一样,都遵守相同字面惯例。
(III):类型参数名称通常由单个字母组成:T(表示任意的类型),E(表示集合
元素类型),K和V(表示映射的键和值类型),X(表示异常)。
(IIII):执行某个动作的方法通常由动词或者动词短语命名。
(IIIII):转换类型的方法:返回不同类型的独立对象的方法,通常被称为
toType;返回视图,通常为asType;返回一个与被调用的对象同值的基本类型的方法,通常为typeValue。
10:谨慎的使用本地方法
(I):本地方法用途:
(a):访问特定于平台的机制的能力,例如访问注册表,和文件锁.
(b):访问遗留代码库的能力,从而可以访问遗留数据.
(c):可以通过本地语言,编写应用程序中注重性能的部分,以提升系统的性能
(II):因为本地语言是不安全的,所有使用本地方法应用程序也不再能免受
内存毁坏错误的影响.