第47条:了解和使用类库

Top 100 Java Libraries on Github 2016

Library Number of Projects Type % of projects
junit.junit 2412 Testing 62.45% Total Projects Tested 3,862
org.slf4j.slf4j-api 895 Logging 23.17% Unique Repos Used 12,059
com.google.guava.guava 650 Utilities 16.83% Total Records 47,251
log4j.log4j 615 Logging 15.92% Avg. repos per project 12.23
commons-io.commons-io 537 Utilities 13.90%
org.slf4j.slf4j-log4j12 479 Logging 12.40%
org.mockito.mockito-all 394 Mocks 10.20%
commons-lang.commons-lang 369 Utilities 9.55%
ch.qos.logback.logback-classic 342 Logging 8.86%
org.apache.commons.commons-lang3 327 Utilities 8.47%
javax.servlet.servlet-api 323 Java Extension 8.36%
org.apache.httpcomponents.httpclient 295 Web 7.64%
org.springframework.spring-context 290 Utilities 7.51%
com.fasterxml.jackson.core.jackson-databind 277 Parsing 7.17%
commons-codec.commons-codec 260 Utilities 6.73%
org.mockito.mockito-core 260 Mocks 6.73%
org.springframework.spring-test 259 Testing 6.71%
joda-time.joda-time 248 Utilities 6.42%
com.google.code.gson.gson 246 Parsing 6.37%
org.testng.testng 234 Testing 6.06%

第48条:如果需要精确的答案,请避免使用float和double

float和double类型主要是为了科学计算和工程计算而设计的。它们执行二进制浮点运算( binary floating-point arithmetic ),这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们并没有提供完全精确的结果,所以不应该被用于需要精确结果的场合。float和double类型尤其不适合用于货币计井,因为要让一个float或者double精确地表示0.1(或者10的任何其他负数次方值)是不可能的。

遗憾的是,它输出的结果是$0.61000000000000000001.

总而言之,对于任何需要精确答案的计算任务,请不要使用float或者double。如果你想让系统来记录十进制小数点,并且不介意因为不使用基本类型而带来的不便,就请使用BigDecimal。使用BigDecima!还有一些额外的好处,它允许你完全控制舍人,每当一个操作涉及舍入的时候,它允许你从8种舍入模式中选择其一。如果你正通过法定要求的舍入行为进行业务计算,使用Bigpecimal是非常方便的。如果性能非常关键,并且你又不介意自己记录十进制小数点,而且所涉及的数值又不太大,就可以使用int或者long。如果数值范围没有超过9位{进制数字,就可以使用int;如果不超过18位数字,就可以使用long。如果数值可能超过18位数字,就必须使用BigDecimal.

第49条:基本类型优先于装箱基本类型

这个程序运行起来比预计的要慢一些,因为它不小心将一个局部变量(sum)声明为是装箱基本类型Long, 而不是基本类型long. 程序编译起来没有错误或者警告,变量被反复地装箱和拆箱,导致明显的性能下降。

那么什么时候应该使用装箱基本类型呢?它们有几个合理的用处。第一个是作为集合中的元素、键和值。你不能将基本类型放在集合中,因此必须使用装箱基本类型。这是一种更通用的特例。在参数化类型中,必须使用装箱基本类型作为类型参数,因为Java不允许使用基本类型。例如,你不能将变量声明为ThreadLocal类型,因此,必须使用ThreadLocal代替。最后,在进行反射的方法调用(见第53条)时,必须使用装箱基本类型。

第50条:如果其他类型更适合,则尽量避免使用字符串

经常被错误地用字符串来代替的类型包括基本类型、枚举类型和聚集类型。

  • 宇符串不适合代替其他的值类型。

  • 字符串不适合代替枚举类型。

  • 字符串不适合代替聚集类型。
    如果一个实体有多个组件,用一个字符串来表示这个实体通常是很不恰当的。例如,下面这行代码来自于真实的系统—标识符的名称已经被修改了,以免发生纠纷:

这种方法有许多缺点。如果用来分隔域的字符也出现在某个域中,结果就会出现混乱。为
了访问单独的域,必须解析该字符串,这个过程非常慢,也很繁琐,还容易出错。你无法提供equals, toString或者compareTo方法,只好被迫接受String提供的行为。更好的做法是,简单地编写一个类来描述这个数据集,通常是一个私有的静态成员类(见第22条).

第53条:接口优先千反射机制

核心“反封机制(core reflection facility) java.lang.reflect, 提供了“通过程序来访问关于已装载的类的信息”的能力。给定一个CIass实例,你可以获得Constructor, Method和Field实例,分别代表了该Class实例所表示的类的Constructor(构造器)、Method(方法)和Field(域)。这些对象提供了“通过程序来访问类的成员名称、域类型、方法签名等信息”的能力。

而且,Constructor, Method和Field实例使你能够通过反扮机制操作它们的底层对等体:通过调用Constructor, Method和Field实例上的方法,可以构造底层类的实例、调用底层类的方法,并访问底层类中的域。例如,Method.invoke使你可以调用任何类的任何对象上的任何方法(遵从常规的安全限制)。反射机制(reflection)允许一个类使用另一个类,即使当前者被编译的时候后者还根本不存在。然而,这种能力也要付出代价:

  • 丧失了编译时类型检查的好处
    包括异常检查。如果程序企图用反射方式调用不存在的或者不可访问的方法,在运行时它将会失败,除非采取了特别的预防措施.
  • 执行反射访问所需要的代码非常笨拙和冗长
    编写这样的代码非常乏味,阅读起来也很困难。
  • 性能损失
    反射方法调用比普通方法调用慢了许多。具体慢了多少,这很难说,因为受到了多个因素的影响。在我的机器上,速度的差异可能小到2倍,也可能大到50倍。

有一些复杂的应用程序需要使用反射机制。这些示例中包括类浏览器、对象监视器、代码分析工具、解释型的内嵌式系统。在RPC(远程过程调用)系统中使用反射机制也是非常合适的。

第54条:谨慎地使用本地方法

Java Native Interface (JNI)允许Java应用程序可以调用本地方法( native method ) ,所谓本地方法是指用本地程序设计语言(比如C或者C++)来编写的特殊方法。本地方法在本地语言中可以执行任意的计算任务,并返回到Java程序设计语言。

从历史上看,本地方法主要有三种用途。它们提供了“访问特定于平台的机制”的能力,比如访问注册表(registry)和文件锁(file lock)。它们还提供了访问遗留代码库的能力,从而可以访问遗留数据(legacy data)。最后,本地方法可以通过本地语言,编写应用程序中注重性能的部分,以提高系统的性能。

使用本地方法来提高性能的做法不值得提倡
使用本地方法有一些严重的缺点口因为本地语言不是安全的,所以,使用本地方法的应用程序也不再能免受内存毁坏错误的影响。因为本地语言是与平台相关的,使用本地方法的应用程序也不再是可自由移植的。使用本地方法的应用程序也更难调试。在进入和退出本地代码时,需要相关的固定开销,所以,如果本地代码只是做少量的工作,本地方法就可能降低(decrease)性能。最后一点,需要“胶合代码”的本地方法编写起来单调乏味,并且难以阅读。

第56条:遵守普遍接受的命名惯例

对于首字母缩写。到底应该全部大写还是只有首字母大写,没有统一的说法。虽然大写更常见一些,但还是强烈建议采用仅有首字母大写的形式:即使连续出现多个首字母缩写的形式,你仍然可以区分出一个单词的起始处和结束处。
下面这两个类名你更愿意看到哪一个,HTTPURL还是HttpUrl ?

类型参数名称通常由单个字母组成。这个字母通常是以下五种类型之一:T表示任意的类型,E表示集合的元素类型,K和V表示映射的键和值类型,X表示异常。任何类型的序列可以是T, U, V或者T1, T2, T3.

对于返回boolean值的方法。其名称往往以单词“is”开头,很少用has。

转载于:https://www.cnblogs.com/myitroad/p/7614710.html

《Effective Java》第8章 通用程序设计相关推荐

  1. 《Effective Java读书笔记》--通用程序设计

    2019独角兽企业重金招聘Python工程师标准>>> 将局部变量作用域最小化 最有力的技术是在第一次使用它时声明,并把它初始化. 如下代码分别用for和while对lst数组做了两 ...

  2. 【读书笔记】《Effective Java》第二章 第2条:遇到多个构造器参数时要考虑使用Builder

    一.前言 <Effective Java>读书笔记系列 第二章 第1条:创建和销毁对象 第二章 第2条:遇到多个构造器参数时要考虑使用Builder 二.介绍 我们开发中偶尔会遇到一些需要 ...

  3. 【Effective Java】第二章:静态工厂、构建器、强化Singleton属性、私有构造器、

    文章目录 一. 用静态工厂方法代替构造器 优势: 劣势: 实例代码: 二. 遇到多个构造器参数时要考虑使用构建器 ① 重叠构建器 ② JavaBeans模式 ③ Builder模式 三. 用私有构造器 ...

  4. [读书笔记]Effective Java 第四章

    使类和成员的可访问性最小化 规则很简单:尽可能地使每个类或者成员不被外界访问.实例域(非final)决不能是公有的.当需要暴露出不可变的实例时通常会把这个实例做成不可变或者是把这个实例变成私有,同时提 ...

  5. Effective Java 读书笔记(七):通用程序设计

    Effective Java 读书笔记七通用程序设计 将局部变量的作用域最小化 for-each 循环优于传统的 for 循环 了解和使用类库 如果需要精确的答案请避免使用 float 和 doubl ...

  6. \(^_^)/ Effective java

    读<Effect Java中文版> 译者序 序 前言 第1章引言 1   第2章创建和销毁对象 4 第1条:考虑用静态工厂方法代替构造函数 4 第2条:使用私有构造函数强化singleto ...

  7. 《Effective Java(第2版)》-Joshua Bloch等

    第2章 创建和销毁对象 第1条:考虑用工厂方法替代构造器 第2条:遇到多个构造器参数时要考虑用构建器 第3条:用私有构造器或者枚举类型强化Singleton属性 第4条:通过私有构造器强化不可实例化的 ...

  8. Effective Java读书笔记四:通用程序设计

    第45条:将局部变量的作用域最小化 在第一次使用变量时的地方声明: 几乎每个局部变量的声明都应该包含一个初始表达式: 如果在终止循环之后不需要循环变量的内容,for循环优于while循环.(for循环 ...

  9. 语言求余和乘除优先级_愉快地学Java语言:第二章基本程序设计 第2讲

    导读 本文适合Java入门,不太适合Java中高级软件工程师. 本文以<Java程序设计基础篇>第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述. 本篇文章只是这个系列中的一篇, ...

最新文章

  1. jedis使用_网易架构师心得:Springboot下使用redis踩过的坑
  2. Flask-admin 学习及一些笔记
  3. 怎么实现java和数据库的链接_JAVA简单链接Oracle数据库,实现注册和登陆的功能
  4. 投稿过程要不要考虑预印本?——medRxiv那些事
  5. Part Ⅳ Shopping 购物??
  6. C++代码 快速排序总结
  7. PHP 服务器变量 $_SERVER(转)
  8. 现代语音信号处理之短时傅里叶分析
  9. 用ubuntu制作ubuntu系统启动盘
  10. php做教务系统管理,基于PHP-MYSQL技术的网络教务管理系统设计
  11. 树莓派4B安装配置LibreELEC并连接到三星电视
  12. 微信支付之微信公众号网页支付(各种总结)
  13. 这图怎么画| 相关性热图+柱状图
  14. 老司机开车|消费升级如何具体化?
  15. DSPE-PEG2K-MAL|磷脂聚乙二醇马来酰亚胺(DSPE-PEG-MAL)|二硬脂酰基磷脂酰乙醇胺 聚乙二醇 马来酰亚胺,齐岳生物
  16. 【纪中受难记】——Day13:还有两天放假
  17. 干货!12个程序员证书​,含金量超高
  18. R 数据分析方法(梅长林)exercise1-4
  19. NAO V6 开发环境的配置(附所有文件)
  20. 达人评测 i5 1135g7和r7 6800h选哪个

热门文章

  1. null NULL is_null 竟然不一样
  2. Html5本地存储和本地数据库
  3. 重构-改善既有代码的设计:重构原则(二)
  4. MySQL第5天:MySQL的架构介绍之主要配置文件
  5. C语言中:在头文件中使用static定义变量意味着什么?
  6. 用IAR调试程序时直接跳过断点执行后面程序的解决办法
  7. 常考数据结构与算法:单调栈结构
  8. 设计模式:迭代器模式(Iterator Pattern)
  9. 前端一HTML:十五: 层叠,权重,优先级的关系
  10. http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.gridview.rowediting.aspx