最近在看EffectiveJava,记录一下,分享一下自己的心得。

一、将局部变量的作用于最小化

  1. 在第一次使用的地方进行声明,过早的声明局部变量,会延长局部变量的生命周期,若在代码块外声明变量,当程序结束代码块后,该变量还是存在的,这并不是我们想要的结果(应该代码块结束后变量销毁)
  2. 当具有足够的信息进行初始化时再进行声明(try-catch代码块除外),当变量的值必须在try块的外部用到,它就必须在try块之前被声明。
  3. 若在循环终止之后不再需要循环变量的内容,能使用for循环就使用for循环,尽量不用while循环。for循环结束后,其局部变量全部销毁,while循环结束后,其变量可能还会存在;for循环比while循环更简洁;for循环中出现错误,程序不会通过编译,while循环中出现错误会在运行时报错。

二、for-each循环优于传统的for循环

  1. for-each循环不用关心容器的类型。
  2. for-each循环完全隐藏了迭代器或者索引变量,避免了混乱和出错的可能。
  3. for-each循环不仅能遍历集合和数组,还可以遍历实现Iterable接口的任何对象。
  4. 三种情况下无法使用for-each循环
    1. 解构过滤,遍历集合过程中需要删除指定的元素。
    2. 转换,若需要遍历列表或数组,并取代它的部分或者全部元素值,需要列表迭代器或者数组索引,便于设定元素的值
    3. 平行迭代,如果需要并行地遍历多个集合,就要显式的控制迭代器或者索引变量。

平行迭代的例子:

enum Num{ONE,TWO,THREE,FOUR,FIVE,SIX}
...
Cllection<Num> nums= EnumSet.allOf(Num.class);
for (Iterator<Num> i = nums.iterator();i.hasNext();)
for(Iterator<Num> j = nums.iterator();j.hasNext();)
System.out.println(i.next()+" "+j.next());

输出结果为:

ONE ONE
TWO TWO
THREE THREE
FOUR FOUR
FIVE FIVE
SIX SIX

此处需要注意:如此循环并不会输出6*6个结果,并且若外层遍历的容器中元素个数少于内层遍历的容器中元素个数,则会抛出NoSuchElementException异常。

参考:《Effective java》P219~P224

EffectiveJava-1的更多相关文章

  1. EffectiveJava——请不要在代码中使用原生态类型

    先看一个栗子,看看能不能找出来里面的错误: /** * 请不要在新代码中使用原生态类型 * @author weishiyao * */ public class Test { public stat ...

  2. EffectiveJava——用函数对象表示策略

    有些语言支持函数指针.代理.lambda表达式,或者支持类似的机制,允许程序把“调用特殊函数的能力”储存起来并传递这种能力.这种机制通常用于允许函数的调用者通过传入第二个函数,来指定自己的行为.比较器 ...

  3. EffectiveJava——类层次优于标签类

    标签类: 有时候,可能会遇到带有两种甚至更多钟风格的类的实例的类,并包含表示实例风格的(tag)域.例如下面这个类,它能够表示圆形或者矩形: /** * 类层次优先与标签类 * @author wei ...

  4. EffectiveJava——接口优于抽象类

    Java程序设计语言提供两种机制,可以用来定义允许多个实现的类型:接口和抽象方法,这两者直接醉为明显的区别在于,抽象类允许某些方法的实现,但接口不允许,一个更为重要的区别在于,为了实现由抽象类定义的类 ...

  5. EffectiveJava——复合优先于继承

    继承时实现代码重用的重要手段,但它并非永远是完成这项工作的最佳工具,不恰当的使用会导致程序变得很脆弱,当然,在同一个程序员的控制下,使用继承会变的非常安全.想到了很有名的一句话,你永远不知道你的用户是 ...

  6. EffectiveJava笔记(第一部分)

    考虑用静态构造方法代替构造器的好处: 1.静态构造方法有名字     BigInteger.probablePrime(int, int, Random)比 new BigInteger(int, i ...

  7. <EffectiveJava>读书笔记--02泛型数组

    1, java中可以申明泛型类型的数组引用; 2, 但是不能实例化一个泛型数组对象; 3, 针对第二点, 可以曲线救国, 实例化一个Object数组, 再进行类型强转; 见代码如下: public c ...

  8. <EffectiveJava>读书笔记--01继承的使用注意

    1, 父类的构造器方法中不能调用能够被子类重写的方法. 分析: 当初始化一个子类时, 首先要初始化父类, 即调用父类的构造方法; 如果父类的构造方法中调用了可被重写的其它方法, 那么此时调用的其实是该 ...

  9. EffectiveJava阅读笔记(一)

    考虑用静态工厂方法代替构造器 一.概述 二.使用静态工厂的优势 获取类对象的两种方式: 使用公有构造方法 静态工厂方法 1.介绍 有名称 不必每次调用时创建一个新对象 可以返回原类型的任何子类型对象 ...

  10. EffectiveJava(30) -- 全面解析enum类型

    --在大多数项目中,我们会经常使用int类型来声明final类型的常量,它在不考虑安全的情况下确实能满足我们绝大多数的需求.但是在JDK1.5版本发布之后,声明一组固定的常量组成合法值的类型就建议使用 ...

随机推荐

  1. EF Core设置字段默认时间

    ---恢复内容开始--- 在EF的官方文档上只提到了用 Fluent API来设置默认值. 但是我们日常开发中,会把公用字段都写成基类.比如行创建时间 在需要默认时间的字段加上一个特性 [Databa ...

  2. Android 横竖屏切换生命周期

    默认情况下,屏幕会旋转并且会重新走生命周期. 1. 屏幕不旋转   在AndroidManifest文件中的对应Activity中配置android:screenOrientation=”landsc ...

  3. python+selenium自动化框架

    ---恢复内容开始--- 主要使用的模块: selenium/webdriver模块(须准备Chrome驱动),主要用于调用浏览器实现自动点击. unittest模块,主要用于整合测试用例. xlrd ...

  4. 快速入门Maven(二)(Eclipse构建Maven项目)

    Mars2的eclipse()已经集成了Maven插件,所以用这个版本不需要装插件了. 接下来构建: 一.调整Eclipse设置 1.选择3.3.9版本的maven软件 2.修改默认的本地仓库地址 二 ...

  5. 上手Typescript,让JavaScript适用于大型应用开发

    Typescript Typescript是一个基于静态类型的,能编译为JavaScript的JavaScript的超集.也就是说任何JavaScript都可以看成是Typescript,IDE能够更 ...

  6. ‎Cocos2d-x 学习笔记(16) 触摸事件与分发 EventTouch dispatchTouchEvent EventListenerTouch

    1. EventTouch 触摸事件的成员变量:枚举EventCode.存储Touch的容器. 不同的EventCode代表不同时机的触摸事件,能让监听器调用不同的回调函数. enum class E ...

  7. 使用git如何规范地向主线提交代码

    使用git向主干分支合并代码通常采用两种方式:第一种是merge,第二种是利用BeyondCompare等工具进行比对,将差异合并到主干: 通过merge合并代码出现冲突时,并不清楚谁的修改和谁的修改 ...

  8. vue入门笔记(新手入门必看)

    一.什么是Vue? 1.    vue为我们提供了构建用户界面的渐进式框架,让我们不再去操作dom元素,直接对数据进行操作,让程序员不再浪费时间和精力在操作dom元素上,解放了双手,程序员只需要关心业 ...

  9. idea的各种牛逼插件

    Translation : 一款免费的解决对话框的翻译插件 MyBatisCodeHelper-Pro: 功能类似mybatis plugin,我的文章有破解的教程 地址:破解

  10. 百万年薪python之路 -- 模块三

    logging 日志模块 loggin模块参数 灵活配置日志级别,日志格式,输出位置: import logging logging.basicConfig(level=logging.DEBUG, ...