《Effective Java》学习笔记 —— 枚举、注解与方法
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》学习笔记 —— 枚举、注解与方法的更多相关文章
- Effective Java 学习笔记之第七条——避免使用终结(finalizer)方法
避免使用终结方法(finalizer) 终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的. 不要把finalizer当成C++中析构函数的对应物.java中,当对象不 ...
- Effective Java 阅读笔记——枚举和注解
30:用enum代替int常量 当需要一组固定常量的时候,应该使用enum代替int常量,除了对于手机登资源有限的设备应该酌情考虑enum的性能弱势之外. 31:用实例域代替序数 应该给enum添加i ...
- Effective Java 学习笔记之所有对象都通用的方法
一.覆盖equals时请遵守通用约定 1.满足下列任何一个条件时,不需要覆盖equals方法 a.类的每个实例本质上都是唯一的.此时就是Object中equals方法所表达的含义. b.不关心类是否提 ...
- Java学习笔记:注解Annotation
annotation的概念 In the Java computer programming language, an annotation is a form of syntactic metada ...
- 0040 Java学习笔记-多线程-线程run()方法中的异常
run()与异常 不管是Threade还是Runnable的run()方法都没有定义抛出异常,也就是说一条线程内部发生的checked异常,必须也只能在内部用try-catch处理掉,不能往外抛,因为 ...
- 1.8(java学习笔记)继承与方法的重写
继承 在java中可以通过继承提高代码的复用率. 例如A继承了B,就可以是 例如,首先有一个类似Person,这个类中有有一些属性和方法,我们再新建一个Student类,其中有一部分属性和方法与Per ...
- Java学习笔记-枚举类
实例有限且固定的类成为枚举类 枚举类的实现 早期时候的实现形式: public static final int SEASON_SPRING = 1; public static final int ...
- java学习笔记----枚举测试题
定义义一个交通灯枚举类,包含红灯.绿灯.黄灯,需要有获得下一个灯的方法,并实现红灯出现5秒之后变成绿灯,绿灯3秒之后变成黄灯,黄灯2秒之后变成红灯,如此循环 public class Test5 { ...
- Effective Java学习笔记
创建和销毁对象 第一条:考虑用静态工厂方法替代构造器 For example: public static Boolean valueOf(boolean b){ return b ? Boolean ...
- Effective Java 学习笔记之创建和销毁对象
一.考虑用静态工厂方法代替构造器 1.此处的静态工厂方法是指返回指为类的对象的静态方法,而不是设计模式中的静态工厂方法. 2.静态工厂方法的优势有: a.使用不同的方法名称可显著地表明两个静态工厂方法 ...
随机推荐
- SQL Server 2012 列存储索引分析(转载)
一.概述 列存储索引是SQL Server 2012中为提高数据查询的性能而引入的一个新特性,顾名思义,数据以列的方式存储在页中,不同于聚集索引.非聚集索引及堆表等以行为单位的方式存储.因为它并不要求 ...
- NodeJS中MySql的增删改查操作
纯粹记录一下最基础写法,几乎没有写什么逻辑,写法也并不是很完善(因为我自己也刚刚摸索出来这么写可以...= =!) 望高手指教 也希望能够帮到比我还新的新手.... //1.insert操作 ...
- quarz时间配置
Cron表达式的格式:秒 分 时 日 月 周 年(可选). 字段名 允许的值 允许的特殊字符 秒 ...
- Linux之添加交换分区
Linux下的交换分区我们可以随意改变大小,如果说日常生活中分区不够用,今天我们来举个例子如何添加. 1.首先是使用dd命令创建一个空文件,这个空文件的大小就是你要继续添加的swap的大小,比如我这里 ...
- Windows10下python3.5的sklearn库安装
具体安装方法参考https://blog.csdn.net/HYDMonster/article/details/79766086 但是注意的是,http://www.lfd.uci.edu/~goh ...
- mnist手写数字检测
# -*- coding: utf-8 -*- """ Created on Tue Apr 23 06:16:04 2019 @author: 92958 " ...
- [Eclipse]如何往eclipse中导入单个python文件,其它类型代码文件也可以参照该方法
实例:想从外部单独拷一个文件到项目中指定路径,如果直接拷到对应文件夹路径下,启动eslipse又识别不到该文件,下面介绍直接copy的方法至eclipse,复制成功后即会在项目中对应路径下产生文件,下 ...
- sphinx编译安装
install sphinx wget http://sphinxsearch.com/files/sphinx-2.0.8-release.tar.gz tar zxvf sphinx--relea ...
- vue2.0模拟锚点
在vue项目中,因为采用路由跳转,会导致无法使用常规的a标签配合ID的锚点功能. 解决办法: <a href="javascript:void(0)" @click=&quo ...
- python第三十课--异常(raise关键字)
演示: 1.手动抛出异常对象-->raise关键字 2.try-except代码不能解决语法错误 try: print('try...') raise TypeError('类型有误的异常') ...