Java的枚举、注解与方法...

第30条 用枚举代替int常量

第31条 用实例域代替序数

  可以考虑定义一个final int 代替枚举中的 ordinal() 方法。

第32条 用EnumSet代替位域(bit field)

  如果底层的枚举类型不超过64个,则整个 EnumSet 就是用单个 long 来表示,因此性能上比得上位域的性能。

第33条 用EnumMap代替序数索引

第34条 用接口模拟可伸缩的枚举

  定义一个接口,然后根据需要,采用不同的枚举,枚举都实现相同的接口,在应用中采用接口作形参。这种模式虽然可以模拟可扩展的枚举类型,但在使用上与原先的枚举类型相比会有很多限制,比如无法使用EnumMap等。

第35条 注解优先于命名模式

  就单元测试而言,现在Java一般都用junit和jmockit的注解,命名模式在标注测试方法上对于编译器而言没有用武之地了。但一般测试方法都还是习惯以test开头。

第36条 坚持使用Override注解

第37条 用标记接口)定义类型

  * 标记接口(maker interface)是没有包含方法声明的接口,例如Serializable

以下为“方法”章节部分:

第38条 检查参数的有效性

  特别是来自不可信域的参数。

第39条 必要时进行保护性拷贝

反例:

     public Period(Date start, Date end) {
this.start = start;
this.end = end;
}

正例:

     public Period(Date start, Date end) {
this.start = new Date(start.getTime());
this.end = new Date(end.getTime());
}

第40条 谨慎设计方法签名

  * 方法的名称应当始终遵循标准的命名习惯。

  * 不要过于追求提供便利的方法。

  * 避免过长的参数列表。

第41条 慎用重载

  * 对于重载方法(overloaded method)的选择是静态的,而对于被覆盖的方法(overridden method)的选择则是动态的。

  对于下面的例子,其实在未运行时已经确定了实际调用的方法。

 import java.util.*;
import java.util.concurrent.DelayQueue; /**
* @author https://www.cnblogs.com/laishenghao/
* @date 2018/10/13
*/
public class BadOverload { public String getType(List<?> list) {
return "List";
} public String getType(Set<?> set) {
return "Set";
} public String getType(Collection<?> collection) {
return "Unknown";
} public static void main(String[] args) { Collection<?>[] collections = {
new ArrayList<>(),
new HashSet<>(),
new DelayQueue<>()
}; BadOverload badOverload = new BadOverload();
for (Collection<?> item : collections) {
System.out.println(badOverload.getType(item)); // all print "Unknown"
}
} }

Bad overload

  * 比较保守的做法:尽量不要导出具有相同类型参数数目的重载方法,或至少有一个完全不同类型的入参。

一个反例:Set 与 List 的 remove 方法造成的混淆:

Set只有一个remove方法,而List有两个:

  boolean remove(Object o);

  E remove(int index);

     public static void main(String[] args) {
Set<Integer> set = new TreeSet<>();
List<Integer> list = new ArrayList<>(); // construct same data
for (int i = -3; i < 3; i++) {
set.add(i);
list.add(i);
} // try to remove the non-negative numbers
for (int i = 0; i < 3; i++) {
set.remove(i);
list.remove(i);
} // result: [-3, -2, -1] [-2, 0, 2]
System.out.println(set + " " + list);
}

第42条 慎用可变参数

  * 检查参数的个数或在前面多写一个相同类型的参数。

     static int min(int first, int... remainingArgs) {
int min = first;
for (int i : remainingArgs) {
if (i < min) {
min = i;
}
}
return min;
}

第43条 返回零长度的数组或者集合,而不是null

  书中推荐返回固定的静态零长度数组或集合。对于固定的返回值,我认为应该视情况而定,如果是后台返回给前台,在没有元素的情况下,返回Collections.emptySet()等是合理的;但如果是在本模块下进行操作,这种不可变的集合就不太适用了,特别是需要对集合做进一步修改的时候。

第44条 为所有导出的API元素编写文档注释

本文地址:https://www.cnblogs.com/laishenghao/p/effective_java_note_enums_annotations_methods.html

												

《Effective Java》学习笔记 —— 枚举、注解与方法的更多相关文章

  1. Effective Java 学习笔记之第七条——避免使用终结(finalizer)方法

    避免使用终结方法(finalizer) 终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的. 不要把finalizer当成C++中析构函数的对应物.java中,当对象不 ...

  2. Effective Java 阅读笔记——枚举和注解

    30:用enum代替int常量 当需要一组固定常量的时候,应该使用enum代替int常量,除了对于手机登资源有限的设备应该酌情考虑enum的性能弱势之外. 31:用实例域代替序数 应该给enum添加i ...

  3. Effective Java 学习笔记之所有对象都通用的方法

    一.覆盖equals时请遵守通用约定 1.满足下列任何一个条件时,不需要覆盖equals方法 a.类的每个实例本质上都是唯一的.此时就是Object中equals方法所表达的含义. b.不关心类是否提 ...

  4. Java学习笔记:注解Annotation

    annotation的概念 In the Java computer programming language, an annotation is a form of syntactic metada ...

  5. 0040 Java学习笔记-多线程-线程run()方法中的异常

    run()与异常 不管是Threade还是Runnable的run()方法都没有定义抛出异常,也就是说一条线程内部发生的checked异常,必须也只能在内部用try-catch处理掉,不能往外抛,因为 ...

  6. 1.8(java学习笔记)继承与方法的重写

    继承 在java中可以通过继承提高代码的复用率. 例如A继承了B,就可以是 例如,首先有一个类似Person,这个类中有有一些属性和方法,我们再新建一个Student类,其中有一部分属性和方法与Per ...

  7. Java学习笔记-枚举类

    实例有限且固定的类成为枚举类 枚举类的实现 早期时候的实现形式: public static final int SEASON_SPRING = 1; public static final int ...

  8. java学习笔记----枚举测试题

    定义义一个交通灯枚举类,包含红灯.绿灯.黄灯,需要有获得下一个灯的方法,并实现红灯出现5秒之后变成绿灯,绿灯3秒之后变成黄灯,黄灯2秒之后变成红灯,如此循环 public class Test5 { ...

  9. Effective Java学习笔记

    创建和销毁对象 第一条:考虑用静态工厂方法替代构造器 For example: public static Boolean valueOf(boolean b){ return b ? Boolean ...

  10. Effective Java 学习笔记之创建和销毁对象

    一.考虑用静态工厂方法代替构造器 1.此处的静态工厂方法是指返回指为类的对象的静态方法,而不是设计模式中的静态工厂方法. 2.静态工厂方法的优势有: a.使用不同的方法名称可显著地表明两个静态工厂方法 ...

随机推荐

  1. 使用 Azure CLI 创建 Windows 虚拟机

    Azure CLI 用于从命令行或脚本创建和管理 Azure 资源. 本指南详细介绍如何使用 Azure CLI 部署运行 Windows Server 2016 的虚拟机. 部署完成后,我们连接到服 ...

  2. 理解 Azure 平台中虚拟机的计算能力

    虚拟化平台至今已经发展了十多年的时间.其中 Hyper-V 技术现在也已经是第三代版本.用户对于虚拟化计算也越来越接受,这也有了公有云发展的基础.然而在很多时候,用户在使用基于 Hyper-V 的 A ...

  3. TexturePacker的plist切成单独小图片

    工具原料 Python 2.7 安装环境 1.安装 Python 2.7 https://www.python.org/download/ 2.配置环境变量 Path :C:\Python27 pyt ...

  4. months_between()用法

    orcl中months_between()函数用法如下: 格式:即MONTHS_BETWEEN(日期1,日期2) 例如: select months_between(to_date('2018-10- ...

  5. [Python_2] Python 基础

    0. 说明 Python 基础笔记,使用的版本为 Python 3.6.2 Python 的变量.字符串操作.list.元组.字典.循环.range.类型转换.运算等操作. 1. 引号的使用 字符串使 ...

  6. Coursera-AndrewNg(吴恩达)机器学习笔记——第四周

    神经网络 1.神经网络发展的动力:在逻辑回归解决复杂的分类问题时,我们使用属性的一些组合来构造新的属性(x12,x1x2,x22...),这样就会造成属性的数目n过多,带来了大量的运算,甚至造成过拟合 ...

  7. 数值分析 最小二乘 matlab

    1. 已知函数在下列各点的值为   -1 -0.75 -0.5 0 0.25 0.5 0.75   1.00 0.8125 0.75 1.00 1.3125 1.75 2.3125 分别用一次.二次. ...

  8. [python] 列表解析式的高效与简洁

    方法一(列表解析式): list1 = ["abc","efg","hij"] list2 = [i[0] for i in list1] ...

  9. Redis系列三:reids常用命令

    全局命令 keys *  查看所有键 dbsize 查看的是当前所在redis数据库的键总数 如果存在大量键,线上禁止使用此指令 exists key 检查键是否存在,存在返回1,不存在返回0 del ...

  10. 2.3.3 Button(按钮)与ImageButton(图像按钮)

    本节引言: 今天给大家介绍的Android基本控件中的两个按钮控件, Button普通按钮 ImageButton图像按钮: 其实ImageButton和Button的用法基本类似,至于与图片相关的则 ...