java程序设计的原则

1 清晰性和原则性最为重要;模块:任何可重用的软件组件,从单个方法到复杂系统都可以是一个模块。代码应该被重用而不是被拷贝。模块之间的依赖性应该降到最小;错误应尽早检查出来,最好在编译期。

2 消除过期的对象引用,

2.1 比如栈中存储对象如果不及时清除对象引用,有可能会造成内存泄漏。

常见的解决办法有

  • 一旦对象不再使用,及时清空这些引用即可
  • 大多数情况下,不必使用上述方法。因为这样做没有必要。消除过期引用的最好方法就是让包含该引用的变量结束其生命周期。所以合适的变量作用域很重要。

2.2 内存泄漏的另一个常见来源是缓存。一旦将对象放到缓存中,很容易遗忘掉。使其不再使用后很长一段时间仍然留在缓存中。

解决该问题的常见方法

  • 随着时间的推移,缓存中的项会变得越来越没有价值。这种情况下,应该时不时的清除掉没用的项。清除工作可以由一个后台线程来完成。
  • 也可以给缓存添加新条目的时候顺便进行清理,linkedHashMap 类利用他的 removeEldestEntry 方法轻松实现
  • 更复杂的缓存,必须直接使用 java.lang.ref

2.3 内存泄漏的第三个常见来源是监听器和其他回调,如果你实现了一个API,客户端在 API 中注册回调,却没有显示的取消注册。如果不采取措施,很容易积聚。确保回调会立即当做垃圾回收的最好方法

是只保存他们的弱引用。

内存分析工具:Heap Profiler

3 避免使用终结方法

一般内存回收应该在代码中及时的结束对象引用。而其他资源一般放在 try-finally 块中。

4 覆盖 object 的 equals 方法

如果类有自己特有的 “逻辑相等” 概念,而且超类没有覆盖 equals 方法,那么我们就需要覆盖 equals 方法。这种就属于“值类” 的概念。值类仅仅是表示一个值的类,例如 Integer、Date

一个比较重要的性质是非空性,意思是在调用 equals 方法时,不能抛出 NullPointerException 异常。常见方法如下

equals 方法具有对称的、传递的、一致的

5 覆盖 equals 方法后总是覆盖 hashCode ,否则会导致所有基于散列的集合类不正常。例如 HashSet、HashMap、HashTable

一个好的散列函数通常倾向于 “为不相等的散列函数产生不相等的散列码”

6 考虑实现 Comparable 接口

如果是一个值类,它具有非常明显的内在排序关系;比如按字母、按数值或者按年代顺序,可以考虑实现 Comparable 接口。需要实现compareTo方法,当该对象小于、等于、大于指定对象时候,分别返回

一个负整数、0、正整数。如果两个对象类型不能进行比较,抛出 ClassCastException。

Comparable 接口性质:自反性、对称性和传递性

7 共有类永远不要暴露可变域,共有类暴露不可变的域是危害比较小的,有时候需要用包级私有或私有的嵌套类来暴露域。

8 要优先使用组合而非继承,如果一个类不是自己维护,或者没有详细文档,尽量使用组合。因为当父类版本升级时,可能会改变内部实现,即便子类代码不变,都有可能产生问题。

如果是自己维护的代码,或者对类的实现非常了解可以谨慎地使用继承。

继承会把超类API中所有缺陷传播到子类中,而复合则允许设计新的 API 来隐藏这些缺陷。

9 好的 API 文档应该描述给定的方法做了什么工作,而不是描述它是如何做到的。

10 在可继承类中构造器不能调用可覆盖方法,如果子类覆盖该方法,可能会产生问题。

effactive java读书小结1的更多相关文章

  1. Effective Java 读书小结 2

    1 接口通常是定义允许多个实现的类型的最好实践.例外情况是演变的容易性比灵活性和功能更为重要,这种情况下使用抽象类来定义类型比较好.如果提供了一个比较重要的接口,最好同时提供骨架实现类. 骨架实现类: ...

  2. Java中文编码小结

    Java中文编码小结 1. 只有 字符到字节 或者 字节到字符 的转换才存在编码转码; 2. Java String 采用 UTF-16 编码方式存储所有字符.unicode体系采用唯一的码点表示唯一 ...

  3. think in java 读书笔记 3 —— 数据报

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 数据报基本知识 2 ...

  4. think in java 读书笔记 2 —— 套接字

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 概要 1. 套接字基本知识 2 ...

  5. think in java 读书笔记 1 ——移位

    目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 think in java 读书笔记 3 —— 数据报 在Think in Java中 ...

  6. Thinking In Java读书笔记--对象导论

    Thinking In Java读书笔记--对象导论[对象]服务提供者==>将对象看做一个服务提供者[程序员分类][类创造者]/[客户端程序员] [访问控制存在的原因?][1]客户端程序员无法触 ...

  7. effective java读书小记(一)创建和销毁对象

    序言 <effective java>可谓是java学习者心中的一本绝对不能不拜读的好书,她对于目标读者(有一点编程基础和开发经验)的人来说,由浅入深,言简意赅.每一章节都分为若干的条目, ...

  8. Java序列化小结

    title: Java序列化小结 date: 2017-05-06 20:07:59 tags: 序列化 categories: Java基础 --- Java序列化就是将一个对象转化成一串二进制表示 ...

  9. head first java读书笔记

    head first java读书笔记 1. 基本信息 页数:689 阅读起止日期:20170104-20170215 2. 标签 Java入门 3. 价值 8分 4. 主题 使用面向对象的思路介绍J ...

随机推荐

  1. Ubuntu 11.04安装GCC 4.6.1

    首先下载相应的源代码:ftp://ftp.dti.ad.jp/pub/lang/gcc/releases/gcc-4.6.1/#下载 gcc-4.6.1.tar.bz2 ftp://ftp.dti.a ...

  2. Swift基础类型

    1.使用 let 来声明常量,使用 var 来声明变量. 注:你能够在一行中声明多个常量或者多个变量.用逗号隔开. 2.类型标注 假设初始值没有提供足够的信息(或者没有初始值),那你须要在变量后面声明 ...

  3. Python break 语句

    Python break 语句 Python break语句,就像在C语言中,打破了最小封闭for或while循环. break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归 ...

  4. arcgis python图形信息

    属性 说明 area 面要素的面积值:对于所有其他要素类型为空 centroid 如果质心位于要素之内或要素之上则为真:否则返回标注点(返回一个点对象) 范围 返回一个范围对象 firstPoint ...

  5. 检查正则表达式的工具:Regex Match Tracer

    Regex Match Tracer破解版下载 使用: 相关: 收藏几个好用的在线正则验证网

  6. HDU 3436 Queue-jumpers

    题意: n个人站成一排  一開始是从1到n有序的  如今有三个操作  Top操作是将一个人排到队首  Query操作是询问某个人如今排第几  Rank操作是询问排某个位置的人是谁 思路: 将队伍扭来扭 ...

  7. http://www.cnblogs.com/zhoujinyi/p/3437475.html

    http://www.cnblogs.com/zhoujinyi/p/3437475.html

  8. PowerDesigner教程系列(一)概念数据模型

    目标: 本文主要介绍PowerDesigner中概念数据模型 CDM的基本概念. 一.概念数据模型概述 数据模型是现实世界中数据特征的抽象.数据模型应该满足三个方面的要求:1)能够比较真实地模拟现实世 ...

  9. go语言基础之函数类型

    1.函数类型 示例: package main import "fmt" func Add(a, b int) int { return a + b } func main() { ...

  10. C#装饰者模式实例代码

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 装饰者 ...