# 3分钟快速阅读-《Effective Java》(四)

#### 31.用实例域代替序数

```public enum Emsemble {
SOLO(1),DUTE(2),TRIO(3),QUARTET(4),QUINTET(5),SEXTET(6);

private final int numberOfMusic;
Emsemble(int number) {
numberOfMusic = number;
}
public int numberOfMusic(){
return numberOfMusic;
}
}```

```    public static void main(String[] args) {
int i = Emsemble.DUTE.numberOfMusic();
System.out.println(i);
}```

#### 32.使用EnumSet代替位域

```public class Text {

public static final int STYLE_BOLD = 1 << 0 ;
public static final int STYLE_TIACLC = 1 << 1 ;
public static final int STYLE_UNDERLINE = 1 << 2 ;
public static final int STYLE_SIRIKETHROUGH = 1 << 3 ;

public void applyStyles(int style){
//TODO
}
}```

```public class Text {
public enum Style{
STYLE_BOLD,STYLE_TIACLC,STYLE_UNDERLINE,STYLE_SIRIKETHROUGH;
}
public void applyStyles(int style){
//TODO
}
}```

#### 33.用EnumMap代替枚举当中的数组

```public enum Person {
JMES,LILI,HEARO,LORSE,MARAY,MICK;
private static final Person[][] HUMAN = {
{JMES,LILI,HEARO},
{LORSE,MARAY,MICK}
};
}```

```    //使用内部嵌套类
private enum Human{
JMES,LILI,HEARO,LORSE,MARAY,MICK;
private static final Map<Person,Map<Person,Human>> MAP = new EnumMap<Person, Map<Person, Human>>(Person.class);
static {
for (Person person : Person.values()) {
MAP.put(person,new EnumMap<Person, Human>(Person.class));
}
}
}```

#### 34.用接口模拟可伸缩的枚举

```//接口
public interface Operator {
double apply(double x,double y);
}

//实现类
//在枚举当中每一常量都是它的一个对象,所以当这个字段需要传递什么参数时,都需要对应的构造器用于初始化这个参数,并且添加相对应的字段,用于表示和初始化
public enum Operation implements Operator{
PLUS("+"){
@Override
public double apply(double x, double y) {
return x + y;
}
},
MINUE("-"){
@Override
public double apply(double x, double y) {
return x > y ? x - y : y - x;
}
},
TIMES("*"){
@Override
public double apply(double x, double y) {
return x * y;
}
},
DIVID("-"){
@Override
public double apply(double x, double y) {

return (x == 0 || y == 0) ? 0 :  x / y;
}
};

private final String symbol;
Operation(String symbol){
this.symbol = symbol;
}

}```

#### 39.必要时进行保护性拷贝

```public final class Period {

private final Date start;
private final Date end;

//在构造器当中加入对于开始时间和结束时间的限制和约束,避免当对象被初始化完成之后,被再次恶意修改了时间
public Period(Date start, Date end) {
this.start = new Date(start.getTime());
this.end = new Date(end.getTime());
if(start.compareTo(end) > 0){
throw new IllegalArgumentException(start + "after" + end);
}
}
public Date strat(){
return new Date(this.start.getTime());
}
public Date end(){
return new Date(this.end.getTime());
}
}```

#### 40.谨慎设计方法签名

• 40.1 谨慎选择方法的名称,请根据不同公司的命名规则进行命名
• 40.2 不要过于追求提供便利的方法.不管是接口或者是类,方法过多都会导致测试难度加强,不易于学习
• 40.3 避免过长的参数列表.最多不要超过4个参数为最佳

0 条评论

• ### 经典笔试题-C++篇

答：for 循环中的变量i 的类型不应定义为vector::size_type， 因为该类型为无符号数值类型，故循环条件将恒成立，为死循环，应将其类型定义为有...

• ### 速读原著-TCP/IP(SNMP对象标识符)

对象标识是一种数据类型，它指明一种“授权”命名的对象。“授权”的意思就是这些标识不是随便分配的，它是由一些权威机构进行管理和分配的。 对象标识是一个整数序列，...

• ### Java--动态代理

代理类MyInvocationHandler 实现（必须实现InvocationHandler接口 ）：

• ### 1044 拦截导弹 1999年NOIP全国联赛提高组 个人博客：attack.cf

1044 拦截导弹 1999年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 ...

• ### R-CNN，Fast R-CNN，Faster-RCNN快速理解

检测资源合集http://objectdetection.cn/2018/05/14/awesome-object-detection/

• ### 教育部：35所高校获批AI专业、203所获批数据科学专业

导读：近日，教育部印发了《教育部关于公布2018年度普通高等学校本科专业备案和审批结果的通知》。

• ### pyecharts（二）：Python可视化利器

專 欄 ❈陈键冬，Python中文社区专栏作者 GitHub： https://github.com/chenjiandongx ❈ 恭喜本社区专栏作者陈键冬...

• ### 2018年9月25日TCP三次握手和四次挥手

其中，ACK是可能与SYN，FIN等同时使用的，比如SYN和ACK可能同时为1，它表示的就是建立连接之后的响应，如果只是单个的一个SYN，它表示的只是建立连...