Effective Java(九)异常

Item 69 异常只用于异常

异常只用于异常的情况,不要用 try-catch 捕获 ArrayIndexOutOfBoundsException 并且不做任何处理这种方式来跳出数组遍历。为什么不用 for-each 循环呢?

设计良好的 API 不应该强迫它的客户端为了正常的控制流程而使用异常。

阅读更多

Effective Java(八)General Programming

Item 57 最小化局部变量的作用域

好的编程习惯:在首次使用的地方声明它。

  1. 如果循环终止后不需要循环变量的内容,那么优先选择 for 循环而不是 while 循环。
  2. 如果变量需要在 try-catch 之外使用,那就必须在外面提前声明,这是一个例外。其他情况都应该遵循在首次使用的地方声明。
  3. 每个行为对应一个方法。保持方法小而集中。
阅读更多

Effective Java(七)方法

Item 49 检查参数有效性

在 Java 7 之后,可以用 requireNonNull 来判空,如果为空,自动抛出空指针异常。

1
this.strategy = Objects.requireNonNull(strategy, "strategy");
阅读更多

Effective Java(六)Lambdas and Streams

Item 42 lambda 表达式优于匿名类

Java 的 Lambda 表达式本质上就是一个匿名类。而什么是匿名类?就是在使用的时候现场 new 并实现的类。

只有一个方法的接口称为 函数式接口(functioning interface),Lambda 表达式本质上就是对这样子的接口做现场实现。可以参考我之前写的:Java简明笔记(八)Lambda和函数式编程

然而 lambda 也不是万能的,它只对函数是接口有用,如果一个接口有多个方法需要重写,那只能用匿名类。this 关键字在 lambda 中引用封闭实例,在匿名类中引用匿名类实例。如果你需要从其内部访问函数对象,则必须使用匿名类。

Lambdas 与匿名类都无法可靠地序列化和反序列化。因此,尽量少去 (如果有的话) 序列化一个 lambda (或一个匿名类实例)。如果有一个想要进行序列化的函数对象,比如一个 Comparator,那么使用一个私有静态嵌套类的实例(见 Item 24 )。

作者建议:一行代码对于 lambda 说是理想的,三行代码是合理的最大值。 如果违反这一规定,可能会严重损害程序的可读性。

阅读更多

Effective Java(五)枚举和注解

Item 34 使用枚举类型替代整型常量

如果你需要一组常量,比如球的红绿蓝三种颜色,四则运算的加减乘除操作,用枚举类会比用 final static intString 好。枚举更具可读性,更安全,更强大。

阅读更多

Effective Java(四)泛型

Java 5 加入了泛型。在有泛型之前,你必须转换从集合中读取的每个对象。如果有人不小心插入了错误类型的对象,则在运行时可能会失败。使用泛型,你告诉编译器在集合中允许存放哪些类型的对象。编译器会自动插入强制转换,并在编译时告诉你是否尝试插入错误类型的对象。

阅读更多

Effective Java(三)类和接口

Item 15 最小化类和成员的可访问性

一个设计良好的组件,应该隐藏其内部细节,将 API 与它的实现分离开来,外界只与 API 通信。这也是软件设计的基本原则。

Java中的四种访问级别:

  • private —— 该成员只能在声明它的顶级类内访问。
  • package-private —— 成员可以从被声明的包中的任何类中访问。从技术上讲,如果没有指定访问修饰符(接口除外,它默认是公共的),这是默认访问级别。
  • protected —— 成员可以从被声明的类的子类中访问,以及它声明的包中的任何类。
  • public —— 该成员可以从任何地方被访问。

能用 private 的,绝不用 protected,能用 protected 的,绝不用 public。

阅读更多

Effective Java(二)对象通用的方法

对象通用的方法,指的是 Object 类下的方法,即 toString、equals、hashCode 等等,合理地使用跟重写它们,可以避免很多坑。

Item 10 重写 equals 时请遵守约定

重写 equals 很容易犯错,最好不要去重写,比如下面的情形:

  1. 类的每个实例都是唯一的。显而易见,像 Thread 这样表示活动而不是值的类来说,每个实例都是不一样的。
  2. 类不需要「逻辑相等(logical equality)」
  3. 父类已经重写了 equals 方法,除非有必要,否则子类就不用再去重写了。例如,大多数 List 从 AbstractList 继承了 equals 实现,Map 从 AbstractMap 的 Map 继承了 equals 实现。
阅读更多

Effective Java(一)创建和销毁对象

《Effective Java》这本书算得上有口皆碑了,去年发现出了第三版,趁某东活动入手了一本英文版,粗略了过了一下,这本书给我最大的体会就是它教你如何成为一个真正的 Java 程序员,而不是 CRUD 程序员或 Spring 程序员,读这本书,能让你站在更高的角度和更深层次的视角去剖析 Java 的细节,让人豁然开朗。然而,上半年因为各种原因,瞎忙活了大半年,这本书一直没机会捡起来仔细看。好在最近工作不忙,想起来有这本书,决定一天看两个 Item 。

系列目录:

阅读更多
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×