设为首页 - 加入收藏
广告 1000x90
您的当前位置:幸运彩票注册 > 幸运飞艇 > 正文

Effective Java笔记(不含反序列化、并发、注解和枚举)

来源:未知 编辑:admin 时间:2018-02-06
  • 3.只有子类是真正的超类的子类型的时候,才适合继承。这就是 is a和like a的区别。
  • 4.在绝大部分情况下用复合替代继承,能隐藏被拓展类细节,恶意避免被扩展类中api的缺陷,被传染到拓展类中
  • 4.要么为继承而设计并提供文档说明要么禁止继承:
    • 1.要设计一个可被继承的类,需要做的事情
      • 1.需要在文档中精确描述覆盖每个方法带来的影响,如可覆盖方法的自用性。如:AbstractCollection中,文档很清楚的说明了如果覆盖了iterator方法会影响remove方法
      • 2.对于为了继承而设计的类,唯一的测试方法就是为其编写子类,如果编写了3个子类都没有使用到某些受保护的成员,那么就可设置为私有
      • 3.构造器不能调用可被覆盖的方法,
      • 4.对于不是为了继承而设计的普通类,可以禁止子类化
      • 5.对于自用性,可以使用替代私有辅助方法代替需要自用的可覆盖的方法
  • 5.接口优于抽象类
  • 6.接口只用于定义类型:
    • 1.常量接口模式是不良的模式
    • 2.导出常量可以在具体类之中
  • 7.用函数对象表示策略:策略模式
  • 4.泛型

    • 1.不要在新代码中使用原生态类型:
      • 1.每个泛型都定义了一 个原生态类型 ,即不带任何实际泛型参数的泛型,List<E>的原生态类型就是List
      • 2.在没有泛型之前,所有的集合内都是一个Object的数组,所以经常会出现将狗插入猫的列表的情况,而且还能运行很久。
      • 3.泛型的好处就是编译器帮你自动处理类型转换,而且如果出现狗插入猫的列表的时候,会在编译的时候就进行提示
      • 4.List和List<Object>的区别在于:前者没有泛型检测,后者在检测的时候表明任何对象都能放入其中。另一个区别就是List=List<String>成立,List<Object>=List<String>会报错,所以如果使用List,那么就可能会出现把猫转化成狗的情况,而使用List<Object>在编译时就会报错
      • 5.如果你对List中的元素毫不在乎,只是想使用他内部的元素的话,可以使用List<?>,这里可以达到和List相同的效果,但是并不能向其内部插入任何元素,也就杜绝了把狗插入到猫列表的情况
      • 6.由于在运行时泛型会擦除,所以在使用instanceof的时候 使用泛型参数是多余的,所以在使用了instanceof之后需要将原生态类型转化成<?>,以避免狗插入猫列表的情况
    • 2.消除非受检警告:
      • 1.首先需要尽可能消除所有的关于泛型的警告,以保证自己的代码是类型安全的
      • 2.如果实在有一些消除不了,那么在确保类型转换正确的情况下,可以使用@SuppressWarnings("unchecked")来禁止警告
      • 3.在每条@SuppressWarnings("unchecked")旁都需要加条注释告诉使用者为什么是正确的
    • 3.优先考虑泛型
    • 4.优先考虑泛型方法
    • 5.利用有限制通配符来提升api的灵活性:
      • 1.参数化类型是不可变的,List<String>不是List<Object>的子类型,我们不能将List<Object>=List<String>,即不能使List<String>向上转型为List<Object>。
      • 2.为了让List<String>可以向上转化,可以将List<Object>替换为List<?extends Object>,这里表示List中可以放一切继承于Object的对象,也就是说List<?extends Object>是List<String>的基类,这样一来就可以有List<?extends Object>=List<String>。
      • 3.但是2中就出现了一个问题:我们在使用List<?extends Object>的插入方法的时候,并不知道究竟应该放入什么类型的对象,因为使用这个对象的时候String的类型信息已经被擦除了。所以为了不让把狗插入猫列表的情况出现。List<?extends Object>禁止插入任何对象。而获取其中的对象都是Object类型。
      • 4.有了2,那么我们如何让List<String>向下转型呢?这时候要引入List<?super String>,这里表示,这个List里面可以放所有为String父类的对象,此时就可以有List<?super String>=List<String>。
      • 5.4中也会有问题,当我们获取List<?super String>中的数据的时候,由于里面放的全是String父类的对象,所以这里所有的返回都是Object。而插入的时候因为每个空都能容纳String父类的对象,所以这个List最少也能插入String和其子类的对象。
      • 6.总结一下:PECS,extends善于提供精确的对象,Super善于插入精确的对象

    5.方法:

    • 1.必要时进行保护性拷贝:在返回一个类中可变的组件的时候,如果我们不希望返回到客户端的组件的改变会影响到原来组件。那么我们需要进行保护性拷贝,即重新创建一个与内部组件信息相同的组件然后返回,这里可以用clone方法。我们可能会担心性能的问题,所以说如果实在不想多创建对象,那么就在文档中标明,不想该组件被改变
    • 2.谨慎设计方法签名:
      • 1.谨慎选择方法名
      • 2.不过于追求复用或者拆分过多的方法:类中的方法数据应该适中,每一个方法需要有比较齐全的功能,只有某一个操作经常被用到才对其进行拆分。
      • 3.避免过长参数:4个以内,
    • 3.慎用重载:
      • 1.永远不用导出两个相同数目参数的重载方法
      • 2.对于可变参数,永远不要重载
    • 4.返回长度为0的集合而不是null
    • 5.为所有导出api写注释

    6.将局部变量的作用域最小化

    • 1.将局部变量的作用域最小化
      • 1.在第一次使用它的时候声明
      • 2.声明的时候需要包含一个初始化表达式,如果不能初始化,就应该推迟声明
      • 3.使用for比while更好
    • 2.foreach比传统循环好
    • 3.需要精确答案避免使用float和double
      • 1.float和double会产生类似0.399999999999999这样的数字,所以可以使用BigDecimal或int或long来代替
      • 2.由于BigDecimal比较不方便和速度慢,所以可以使用int或long分成整数和小数来计算
    • 4.基本类型优于封装类型:
      • 1.如果一个Integer返回了null,然后又被自动拆箱,那么就会抛出异常
      • 2.在一些循环中,如果使用了封装类型,就会返回装箱和拆箱影响性能
      • 3.同一个值的封装类型,进行==比较的时候会返回false
    • 5.尽量避免使用字符串:不推荐用字符串代替其他值类型
    • 6.使用接口引用对象
    • 7.接口优先于反射机制
      • 1.性能损失
      • 2.丧失了编译时检测的好处
      • 3.代码笨重

    7.异常

    • 1.只针对异常情况使用异常:不能使用异常控制代码的正常流程,只能在出现意料之外的情况下使用异常
    • 2.对可恢复的情况使用受检异常对编程错误使用运行时异常
      • 1.一个api如果抛出异常,说明需要客户端在调用的时候自己处理并恢复,或者抛出异常
      • 2.异常也是对象
    • 3.优先使用标准异常:
      • 1.IllegalArgumentException 传参不对
      • 2.IllegalStateException 非法调用一个对象
      • 3.IndexOutOfBoundsException 参数越界
      • 4.ConcurrentModificationException 单线程类被并发修改
      • 5.UnsupportedOperationException 不支持用户调用的方法
    • 4.抛出与抽象对应的异常:
      • 1.高层捕获了低层异常之后,需要抛出高层的异常
      • 2.在构造高层异常的时候传入底层异常被称为异常链。
    上一篇:java并发编程实战笔记(部分实战未看,老旧章节跳过)
    下一篇:没有了

    相关文章:

    相关推荐:

    网友评论:

    无法在这个位置找到: ajaxfeedback.htm
    栏目分类
    最新文章
    热门文章

    凤凰彩票 联系QQ: 邮箱:

    Copyright © 2002-2011 DEDECMS. 织梦科技 版权所有 Power by DedeCms

    Top