第九章通用编程

目录

  • 最小化局部变量的作用域
  • for-each循环优于传统for循环
  • 熟悉并使用Java类库
  • 需要精确的结果时避免使用float和double类型
  • 基本类型优于装箱的基本类型
  • 当有其他更合适的类型时就不用字符串
  • 注意字符串连接的性能
  • 通过对象的接口引用对象
  • 接口优于反射
  • 明智谨慎地使用本地方法
  • 明智谨慎地进行优化
  • 遵守普遍接受的命名约定

通用编程

最小化局部变量的作用域

  • 将局部变量的作用域控制在最小,在使用时才定义

for-each循环优于传统for循环

  • 有三个例外(for each只能用于读取,不能用于修改)

熟悉并使用Java类库

  • 总而言之,不要重新发明轮子。 如果需要做一些似乎应该相当常见的事情,那么类库中可能已经有了一个可以满足你需求的工具。 如果有,请使用它; 如果不知道,请检查。 一般来说,类库代码可能比您自己编写的代码更好,并且可能会随着时间的推移而改进。 这并不反映你作为程序员的能力。 规模经济决定了类库代码得到的关注远远超过大多数开发人员可以承担的相同的功能。

需要精确的结果时避免使用float和double类型

  • 对于任何需要精确答案的计算,不要使用float或double。如果希望系统控制十进制小数点,并且不介意不使用基本类型带来的不便和成本,请使用BigDecimal。使用BigDecimal的另一个好处是,它可以完全控制舍入,当执行需要舍入的操作时,可以从八种舍入模式中进行选择。如果你使用合法的舍入行为执行业务计算,这将非常方便。如果性能是最重要的,那么不介意自己控制十进制小数点,而且数量不是太大,可以使用int或long。如果数量不超过9位小数,可以使用int;如果不超过18位,可以使用long。如果数量可能超过18位,则使用BigDecimal。

基本类型优于装箱的基本类型

  • 只要有选择,就应该优先使用基本类型,而不是装箱基本类型。基本类型更简单、更快。如果必须使用装箱基本类型,则需要小心!自动装箱减少了使用装箱基本类型的冗长,但没有降低使用的危险。当程序使用==操作符比较两个装箱的基本类型时,它会执行引用标识比较,这几乎肯定不是你想要的。当程序执行包含装箱和拆箱基本类型的混合类型计算时,它会执行拆箱,当程序执行拆箱时,会抛出NullPointerException。最后,当程序装箱了基本类型,可能会导致代价高昂且创建了不必要的对象。

当有其他更合适的类型时就不用字符串

  • 当存在或可以编写更好的数据类型时,避免将对象表示为字符串的自然倾向。 使用不当,字符串比其他类型更麻烦,更灵活更差,速度更慢,更容易出错。

注意字符串连接的性能

  • 除非性能无关紧要,否则不要使用字符串连接操作符组合多个字符串。而是使用StringBuilder的append方法。或者,使用字符数组,或者一次处理一个字符串,而不是把它们组合起来。

通过对象的接口引用对象

  • 使用接口而不是类来引用对象。这样程序会更加的灵活

接口优于反射

  • 反射是一种功能强大的机制,对于特定的复杂系统编程任务(工具类)是必须的,但是也有一些缺点:
    a.反射三十了编译时类型检查的好处
    b.执行反射访问所需要的代码非常笨拙和冗长
    c.性能松狮

明智谨慎地使用本地方法

  • Java Native Interface(JNI)允许Java程序调用本地方法(native methods),这些方法是用本地编程语言(如C或C ++)编写的方法。
  • 在使用本地方法之前要三思而后行。 很少需要使用它们来提高性能。 如果必须使用本地方法来访问地城资源或本地类库,请尽可能少地使用本地代码,并对其进行彻底测试。 本地代码中的单个错误可能会破坏整个应用程序。

明智谨慎地进行优化

  • 如你过早优化的话,弊大于利。 在此过程中,可能会生成既不快,又不正确,且无法轻松修复的软件。
  • 努力编写好的程序,而不是快的程序。如果一个好的程序不够快,它的架构允许对其进行优化。好的程序体现了信息隐藏的原则:在可能的情况下,他们设计决策本地化为单个组件,因此可以在不影响系统其余部分的情况下更改单个决策。实现问题可以通过以后的优化来解决,但是如果不重写系统,就无法修复限制性能的普遍存在的架构缺陷
  • 总而言之,不要努力写出快速的程序——努力写出好的程序; 这样速度将随之而来。 但是在设计系统时要考虑性能,尤其是在设计API,线级协议和持久化数据格式时。 完成系统构建后,请测量其性能。 如果它足够快,你就完成了。 如果没有,请借助分析工具找到问题的根源,然后开始优化系统的相关部分。 第一步是检查算法选择:再多低级优化也不可以弥补差的算法选择。 根据需要重复此过程,在每次更改后测量性能,直到满意为止。

遵守普遍接受的命名约定

  • 命名约定分为两类:字面(typographical)的和语法的(grammatical)
  • 转换对象类型,返回不同类型的独立对象的实例方法通常称为toType,例如toString或toArray。 返回类型与接收对象类型不同的视图(条目 6)的方法通常称为asType,例如asList。 返回与调用它们的对象具有相同值的基本类型的方法通常称为typeValue,例如intValue。 静态工厂的常用名称包括from,of,valueOf,instance,getInstance,newInstance,getType和newType

参考

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 所有知识点已整理成app app下载地址 J2EE 部分: 1.Switch能否用string做参数? 在 Jav...
    侯蛋蛋_阅读 2,710评论 1 4
  • 本章内容导图: 1.将局部变量的作用域最小化 同“使类和成员的可访问性最小化”一样,将局部变量的作用域最小化,可以...
    塞外的风阅读 527评论 0 0
  • TITLE: 编程语言乱炖 码农最大的烦恼——编程语言太多。不是我不学习,这世界变化快! 有时候还是蛮怀念十几、二...
    码园老农阅读 5,594评论 2 35
  • 下午去理发了。来到往常理发的小店,是一对三十多岁的东北夫妻共同开的“小发店”说它小,是因为理发门面加居住的,小屋的...
    雨点儿滴哒阅读 390评论 1 12
  • 1,认识web -- web开发指的就是写网页,web标准中,将网页开发规范分为三个标准:1),结构标准---ht...
    pythonefb6阅读 569评论 0 0

友情链接更多精彩内容