Effective Java(36~40)

第36条 坚持使用Override注解

使用Override注解来覆盖超类声明

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

标识接口是没有任何方法和属性的接口。标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型。标接口在Java语言中有一些很著名的应用,比如Clonable,Serializable,RandomAccess,Remote等接口便是标识接口。标识接口,当一个类实现了一个标识接口之后就像是给自己打了个标签。

(1)Clonable标记接口的作用是通知虚拟机,用户已经处理好对象深拷贝的事情,虚拟机检查通过。如果没有申明Clonable接口,但是调用了clone()方法,虚拟机会抛出异常。

(2)RandomAccess标记接口:这个通常用来标记集合对象可以随机访问。我们知道,对于for语句和foreach语句是有区别的,for语句需要对象具备随机访问的特性,foreach语句则只需要对象实现Iterator接口。如果一个集合对象声明了RandomAccess接口,那么我们就可以根据如下语句判断,使用for语句来随机访问集合对象,进而优化代码:

 if (anObject instanceof RandomAccess) { // 随机访问anObject }

(3)Serializable标记接口:这个接口用来标识该类对象可以被序列化。如果没有声明该接口,类对象在被序列化和反序列化过程中,JVM虚拟机抛出异常。

(4)Remote标记接口:Remote标记接口主要用来通知JAVA虚拟机该类所包含的方法可以从非本地虚拟机上调用。如果不声明该接口,进行远程调用的时候,JVM抛出异常。

第38条 检查参数的有效性

每当编写方法或者构造器的时候,应该考虑他的参数有哪些限制。应该把这些限制写到文档中,并且在这个方法体的开头处,通过显式的检查来实施这些限制。养成这样的习惯是非常重要的。

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

public 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(this.start.compareTo(this.end) > 0){
            throw new IllegalArgumentException(this.start + " after " + this.end);
        }
    }

    public Date start(){
        return start;
    }

    public Date end(){
        return new Date(end.getTime());
    }
}

保护性拷贝是在检查参数的有效性之前进行的,并且有效性检查是针对拷贝之后的对象,而不是原始对象。

对于参数类型可以被不可信任方子类化的参数,请不要使用clone方法进行保护性拷贝。

第40条 谨慎设计方法签名

(1)谨慎地选择方法地名称

(2)不要过于追求提供便利的方法

(3)避免过长的参数列表

(4)对于参数类型,要优先使用接口而不是类

(5)对于boolean参数,要优先使用两个元素的枚举类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值