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条 必要时进行保护性拷贝

反例:

  1. public Period(Date start, Date end) {
  2. this.start = start;
  3. this.end = end;
  4. }

正例:

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

第40条 谨慎设计方法签名

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

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

  * 避免过长的参数列表。

第41条 慎用重载

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

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

  1. import java.util.*;
  2. import java.util.concurrent.DelayQueue;
  3.  
  4. /**
  5. * @author https://www.cnblogs.com/laishenghao/
  6. * @date 2018/10/13
  7. */
  8. public class BadOverload {
  9.  
  10. public String getType(List<?> list) {
  11. return "List";
  12. }
  13.  
  14. public String getType(Set<?> set) {
  15. return "Set";
  16. }
  17.  
  18. public String getType(Collection<?> collection) {
  19. return "Unknown";
  20. }
  21.  
  22. public static void main(String[] args) {
  23.  
  24. Collection<?>[] collections = {
  25. new ArrayList<>(),
  26. new HashSet<>(),
  27. new DelayQueue<>()
  28. };
  29.  
  30. BadOverload badOverload = new BadOverload();
  31. for (Collection<?> item : collections) {
  32. System.out.println(badOverload.getType(item)); // all print "Unknown"
  33. }
  34. }
  35.  
  36. }

Bad overload

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

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

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

  boolean remove(Object o);

  E remove(int index);

  1. public static void main(String[] args) {
  2. Set<Integer> set = new TreeSet<>();
  3. List<Integer> list = new ArrayList<>();
  4.  
  5. // construct same data
  6. for (int i = -3; i < 3; i++) {
  7. set.add(i);
  8. list.add(i);
  9. }
  10.  
  11. // try to remove the non-negative numbers
  12. for (int i = 0; i < 3; i++) {
  13. set.remove(i);
  14. list.remove(i);
  15. }
  16.  
  17. // result: [-3, -2, -1] [-2, 0, 2]
  18. System.out.println(set + " " + list);
  19. }

第42条 慎用可变参数

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

  1. static int min(int first, int... remainingArgs) {
  2. int min = first;
  3. for (int i : remainingArgs) {
  4. if (i < min) {
  5. min = i;
  6. }
  7. }
  8. return min;
  9. }

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

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

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

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

  1.  

《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. heckboxlist详细用法、checkboxlist用法、checkboxlist

    heckboxlist详细用法.checkboxlist用法.checkboxlist for (int i = 0; i < CheckBoxList1.Items.Count; i++) { ...

  2. SQL Server 复制表结构、整表数据

    1.将表1结构复制到表2 SELECT * INTO 表2 FROM 表1 WHERE 1=2 2.将表1内容全部复制到表2 SELECT * INTO 表2 FROM 表1

  3. Zabbix 添加主机,获取模板templateID

    添加一个Host Name=Mail CAS_1.1,IP=10.16.3.4的主机,并加入组groupID=30,连接模板templateID=10132. # -*- coding: UTF-8 ...

  4. Cisco HSRP 配置方法(热备份路由协议)配置实例

    转裁于51CTO.http://www.mamicode.com/info-detail-862350.html HSRP----热备份路由协议 思科私有协议,与VRRP 虚拟路由协议 相近,(国际标 ...

  5. ip 命令的使用

    网上相似的资源很多,可以参考如下资料: man ip ip help 博客链接: https://linoxide.com/linux-command/use-ip-command-linux/ ht ...

  6. Java MySQL数据类型对照

    Java MySQL数据类型对照 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             varchar L+N VARCHAR java.lang.S ...

  7. set集合综合案例

    案例01:生成0-10之间5个不相等的数 方法1:使用list集合实现 import random list01 = [] for i in range(100): num01 = random.ra ...

  8. vbs常用函数

    aa '删除文件夹 sub DeleteFolder(objFolder) call OutputLog(objFolder.Path,true) err.Clear On Error Resume ...

  9. 【Android自动化】测试系统的应用程序安装与卸载性能,判断长时间反复安装对系统的整体性能影响

    # -*- coding:utf-8 -*- import sys import os import time import subprocess from uiautomator import de ...

  10. 关于Java集合类库中的几种常用队列

    Java中几种常用的队列 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞 ...