Effective java中对通用编程的建议

Effective java中对通用编程的建议

 1.将局部变量的作用域最小化。

       将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性。
       要使局部变量的作用域最小化,最有力的办法就是在第一次要使用它的地方进行声明。
       几乎每一个局部变量的声明都应该包含一个初始化表达式。
       因为循环变量的作用域被限定在正好需要的范围内,因此for循环优先于while循环。并且for循环更简短,增强了可读性。
       遍历集合的首选做法
       For(Element e:c){}

2.for-each循环优先于传统的for循环

       For-each循环解决了迭代器和索引混乱的问题。同时简化了将容器的实现类型从一种转换到另一种的过程。
       For(Element e : elements){}
       使用嵌套式for-each循环的时候,更加简洁,可读性更高
       不能使用for-each循环的情况
       1.解构过滤,如果需要遍历集合,并且删除特定的元素,就需要使用显式的迭代器,以便调用remove方法。
       2.转换,如果内部需要遍历列表或者数组,并且替代部分或者全部元素值,就需要列表迭代器或者数组索引。
       3.平行迭代,如果需要并行遍历多个集合,就需要显式控制迭代器或者索引变量,以便所有迭代器或者索引变量都可以同步进行。

3.了解和使用类库

Static Random rnd = new Random();
Static int random(int n){
Return Math.abs(rnd.nextInt())n;
}
       求随机数这个方法感觉不错,但是很大缺陷,1.如果n是一个比较小的2的乘方,经过一段短的周期起来,产生的随机数序列会重复2.如果n不是2的乘方,那么平均起来,有些书会比其他的数出现的更加频繁,如果n比较大,这个缺点明显3.极少数情况下,失败是灾难性的,因为会返回一个在范围外的数。

       现在可以使用random.nextInt(int);
       现在选择随机数生成器时,大多使用ThreadLocalRandom,产生更高质量的随机数。

       使用标准类库的好处
       1.通过使用标准类库,可以充分利用标准类库的专家的知识。
       2.不必浪费时间在那些与工作不太相关的问题提供特别的解决方案
       3.性能往往会随着时间推移而推高
       4.会随着时间推移而增加不同功能。
       5.可以使自己代码融入主流。

每个程序员都应该熟悉java.lang,java.util,java.io及其子包中的内容。Collections Framework和streams必须掌握。

4.如果需要精确的答案,避免使用float和double

       Float和double类型尤其不适合用于货币计算
       计算货币正确的方法是使用BigDecimal,int和long进行货币计算

5.基本类型优先于装箱基本类型

       基本类型和包装类型的主要区别
       1.基本类型只有值,而装箱基本类型则具有与他们的值不同的同一性,两个装箱基本类型可以具有相同的值和不同的同一性
       2.基本类型只有函数值,装箱基本类型则都有一个非函数值,还有null
       3.基本类型通常比包装基本类型更节省时间和空间。

       对包装类型使用==操作符几乎总是错误的
       当在一项操作中混合使用基本类型和装箱类型时,装箱类型机会自动拆箱。

       ;使用装箱基本类型的情况
       1.第一个是作为集合中的元素,键和值。不能将基本类型放在集合中,因此必须使用装箱基本类型。
       2.才参数化类型和方法中,必须使用装箱基本类型作为参数类型,因为java不允许使用基本类型。例如ThreadLocal类型就是错误的,ThreadLocal才是可以的。
       3.在进行反射的方法调用时,必须使用装箱基本类型。

6.如果其他类型更适合,则尽量避免使用字符串

       字符串不适合代替其他的值类型
       字符串类型不适合代替枚举类型
       字符串类型不适合代替聚合类型
       字符串也不适合代替能力表

7.了解连接字符串的性能

       使用+可以连接一行输出,或者构造一个字符串来表示一个小的大小固定的对象,但是适用于大规模的场景中。
       为了获得可以接受的性能,使用stringBuilder代替String,append方法拼接字符串。

8.通过接口引用对象。

       如果有合适的接口类型存在,那么对于参数,返回值,变量和域来说,就都应该使用接口类型进行声明。
       声明变量的时候应该像这样
       Set sonSet = new LinkedHashSet<>();
       这样需要更换实现的时候更简单
       Set sonSet = new HashSet<>();
       如果没有合适的接口存在,完全可以用类而不是接口来引用对象。
       如果没有合适的接口,就用类层次结构中提供了必要功能的最小的具体内容来引用对象。

9.接口优先于反射机制

       给定一个class对象,可以获得Constructor,Method 和Field实例,分别代表构造器,方法和域。而且,Constructor,Method 和Field实例使你能够通过反射机制操作它们的底层对等体,通过调用Constructor,Method 和Field实例上的方法,可以构造底层类的实例,调用底层类的方法,访问底层类中的域。
       反射机制以功能强大的机制,对于特定的复杂系统编程任务,是非常必要的,,如有可能,就应该仅仅使用反射机制来实例化对象,而访问对象时则使用编译时已知的摸个接口或者超类。

10.谨慎的使用本地方法

       JNI允许java应用程序调用本地方法(native method),本地方法就是本地编程语言来编写的方法。
       使用本地方法来提高性能的做法不值得提倡。

11.谨慎的进行优化

       1.很多计算上的过失都归咎于效率(没有达到必要的效率),而不是其他的任何原因 ----甚至包括盲目的做傻事
       2.不要去计较效率上的一些小小的得失,在97%情况下,不成熟的优化才是一切问题的根源
       3.在优化方面,我们应该遵守两条规律
       规则1不要进行优化
       规则2(仅针对专家)还是不要进行优化----也就是说,在你还没有绝对清晰的未优化方案之前,不要进行优化。

       要努力编写好的程序而不是快的程序
       要努力避免那些限制性能的设计决策
       要考虑API设计决策的性能后果
       为获得好的性能而对API进行包装,这是一种非常不好的行为
       在每次试图做优化之前和优化之后,要对性能进行测量。

12.遵守普遍接受的命名惯例
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值