公共程序设计
笔记:
common programmer design:
1、将局部变量的作用域最小化
要使局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明
几乎每个局部变量的声明都应该包含一个初始化表达式
如果在循环终止之后就不再需要循环变量的内容,for循环就优于while循环
2、for-each循环优先于传统的for循环
for-each是隐藏版本的iteratorf for循环遍历
三种常见的情况无法使用for-each循环:
1、过滤-如果需要遍历集合,并删除选定的元素,就需要使用显式的迭代器,以便可以调用它的remove方法
2、转换-如果需要遍历列表或者数组,并取代它部分或者全部的元素值,就需要列表迭代器或者数组索引,以便设定元素的值
3、平行迭代-如果需要并行地遍历多个集合,就需要显式地控制迭代器或者索引变量,以便所有迭代器或者索引变量都可以得到同步前移
3、了解和使用类库
原因:
自己写的类库可能不够专业,考虑不够全面,测试不够等
使用标准类库可以充分利用这些编写标准类库专家的知识,以及在你之前其他人的使用经验
不需要浪费时间为那些与工作不太相关的问题提供特别的解决方案
标准类库不断在被人们使用被推动,它们的性能会随着时间的推移不断提高
可以使自己代码融入主流
4、如果需要精确的答案,请避免使用float和double
float和double类型主要是为了科学计算和工程计算而设计的。它们执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们并没有提供完全精确的结果,所以不应该用于需要精确结果的场合。
float和double类型尤其不适合用于货币计算,解决这个问题的正确方法是使用BigDecimal、int或者long进行货币计算
5、基本类型优先于装箱基本类型
基本类型和装箱基本类型三个主要区别:
基本类型只有值,而装箱基本类型则具有与它们的值不同的同一性。换句话来说,两个装箱基本类型可以具有相同的值和不同的同一性。
基本类型只有功能完备的值,而每个装箱基本类型除了它对应基本类型的所有功能外,还有个非功能值:null。
基本类型通常比装箱基本类型更节省时间和空间
在一项操作中混合使用基本类型和装箱基本类型时,装箱基本类型就会自动拆箱
变量被反复地拆装箱容易导致性能下降
6、如果其他类型更适合,则尽量避免使用字符串
字符串不适合代替其他的值类型
字符串不适合代替枚举类型
字符串不适合代替聚集类型
就是字符串拼接代表多个业务意义的东西,通常使用私有的静态成员类替代
字符串也不适合代替能力表
7、当心字符串连接的性能
为链接n个字符串而重复地使用字符串连接操作符,需要n的平方级的时间。这是由于字符串不可变而导致的不幸结果,遇到连接的时候,可以考虑StringBuffer和StringBuilder
8、通过接口引用对象
如果有合适的接口类型存在,那么对于参数、返回值、变量和域来说,就都应该使用接口类型进行声明
这样会使得程序更加灵活
如果没有合适的接口存在,完全可以用类而不是接口来引用对象
如果是基于类的框架,就应该用相关的基类来引用这个对象
当类实现了接口但是提供了接口中不存在的额外方法,如果程序依赖于这些额外方法,这种类应该只被用来引用它的实例。
9、接口优先于反射机制
反射提供了通过程序来访问类的成员名称、域类型。方法签名等信息的能力
然而:丧失了编译时类型检查的好处;执行反射访问需要的代码非常笨拙和冗长;性能损失
10、谨慎地使用本地方法
JNI允许java应用程序调用本地方法
从历史上看,本地方法主要有三种用途。它们提供了“访问特定于平台的机制”的能力,比如访问注册表;它们还提供了访问遗留代码库的能力,从而可以访问遗留数据;最后本地方法可以通过本地语言,编写应用程序中注重性能的部分,以提高系统的性能。
使用本地方法来提高心梗的做法不值得提倡
11、谨慎地进行优化
不要费力去编写快的程序,应该努力编写好的程序
12、遵守普遍接受的命名规范
任何在你组织之外使用的包,其名称都应该以你组织的Internet域名开头,并且顶级域名放在前面,如com.sun;
包名称的其余部分应该包括一个或者多个描述该包的组成部分。这些组成部分应该比较简短,通常不包括8个字符串,鼓励使用有意义的缩写格式,例如util替代utilities,只取首字母缩写也是可以接受的,如awt
类和接口的名称都应该包括一个或者多个单词,每个单词的首字母大写
方法和域的名称与类和接口的名称一样,遵守同样的字面惯例,不过方法或者域的名称首字母小写。
常量域的名称应该包含一个或者多个大写的单词,中间用下划线符号隔开,例如VALUES或者NEGATIVE_INFINITY
局部变量名称的命名与成员名称类似,只不过它也允许缩写
类型参数名称通常由单个字母组成,这个字母通常是以下5种类型之一:T表示任意的类型,E表示集合的元素类型,K和V表示映射的键和值类型,X表示异常
有关代码:
package chapter7; import java.util.Arrays; import java.util.Comparator; import java.util.Set; /** * @author zhen * @Date 2018/10/8 17:33 */ public class Demo { static Integer i; Comparator<Integer> naturalOrder = new Comparator<Integer>() { @Override public int compare(Integer first, Integer second) { //这里可能会出现预期之外的情况,如new Integer(52)和newInteger(52)之间的比较会在first==second中得到false,所以得到结果为1 //return first < second ? -1 : (first == second ? 0 : 1); int o1 = first; int o2 = second; return o1 < o2 ? -1 : (o1 == o2 ? 0 : 1); } }; // public static void main(String[] args) { // if (i == 42) {//throws NullPointException // System.out.println("Unbelievable"); // } // } public static void main(String[] args) { Class<?> cl = null; try{ cl = Class.forName(args[0]); }catch (ClassNotFoundException e){ System.err.println("Class not found."); System.exit(1); } //Instantiate the class Set<String> s = null; try{ s = (Set<String>)cl.newInstance(); }catch (IllegalAccessException e) { System.err.println("Class not accessible."); System.exit(1); }catch (InstantiationException e) { System.err.println("Class noy instantiable."); System.exit(1); } //Exercise the set s.addAll(Arrays.asList(args).subList(1, args.length)); System.out.println(s); } }
package chapter7; /** * @author zhen * @Date 2018/10/9 9:48 */ public final class ThreadLocal<T> { private ThreadLocal() {} // // public void set(T value); // // public T get(); }

浙公网安备 33010602011771号