Effective Java
马冬冬
手艺人
展开
-
第4章 类和接口
第13条:使类和成员的可访问性最小化 第14条:在公有类中使用访问方法而非公有域 毫无疑问,说到公有类的时候,坚持面向对象程序设计思想的看法是正确的:如果类可以在它所在的包的外部进行访问,就提供访问方法,以保留将来改变该类的 内部表示法的灵活性。如果公有类暴露了它的数据域,要想在将来改变其内部表示法是不可能的,因为公有类的客户端代码已经遍布各处了。 第15条:使可变原创 2015-09-11 20:54:50 · 328 阅读 · 0 评论 -
第11章 序列化
第74条:谨慎地实现Serializable接口 实现Serializable接口而付出的最大代价是,一旦一个类被发布,就大大降低了“改变这个类的实现”的灵活性。 第二个代价是,它增加了出现Bug和安全漏洞的可能性。 第三个代价是,随着类发行新的版本,相关的测试负担也增加了。 为了继承而设计的类应该尽可能少地去实现Serializable接口,用户的接口也应该尽可能少地继承Seri原创 2015-09-18 16:44:21 · 331 阅读 · 0 评论 -
第9章 异常
第57条:只针对异常的情况才使用异常 对于“状态测试方法”和“可识别的返回值”这两种做法,有些指导原则可以帮助你在两者之中做出选择。如果对象将在缺少外部同步的情况下被并发访问, 或者可被外界改变状态,使用可被识别的返回值可能是很有必要的,因为在调用“状态测试”方法和调用对应的“状态相关”方法的时间间隔之中,对象的 状态有可能会发生变化。如果单独的“状态测试”方法必须重复“状态相关”方原创 2015-09-17 17:07:22 · 307 阅读 · 0 评论 -
第8章 通用程序设计
第45条:将局部变量的作用域最小化 要使局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明。 几乎每个局部变量的声明都应该包含一个初始化表达式。 第46条:for—each循环优先于传统的for循环 for-each循环在简洁性和预防Bug方面有着传统的for循环无法比拟的优势,并且没有性能损失。应该尽可能地使用for-each循环。遗憾的是,有 三原创 2015-09-17 15:43:47 · 325 阅读 · 0 评论 -
第7章 方法
第38条:检查参数的有效性 每当编写方法或者构造器的时候,应该考虑它的参数有哪些限制。应该把这些限制写到文档中,并且在这个方法体的开头处,通过显示的检查来实施 这些限制。养成这样的习惯是非常重要的。只要有效性检查有一次失败,你为必要的有效性检查所付出的的努力便都可以连本带利地得到偿还了。 第39条:必要时进行保护性拷贝 假设类的客户端会尽其所能来破坏这个类的约束条件原创 2015-09-16 21:56:06 · 301 阅读 · 0 评论 -
第6章 枚举和注解
第30条:用enum代替int常量 枚举类型(enum type)是指由一组固定的常量组成合法值的类型。 Java枚举类型背后的基本想法非常简单:它们就是通过公有的静态final域为每个枚举常量导出实例的类。因为没有可以访问的构造器,枚举类型是真正 的final。因为客户端既不能创建枚举类型的实例,也不能对它进行扩展,因此很可能没有实例,而只有声明过的枚举常量。换句话说,枚举类型是实原创 2015-09-15 22:07:38 · 404 阅读 · 0 评论 -
第5章 泛型
第23条:请不要在新代码中使用原生态类型 声明中具有一个或者多个类型参数的类或者接口,就是泛型类或者接口。 每种泛型定义一组参数化的类型,构成格式为:先是类或是接口的名称,接着用尖括号( 最后一点,每个泛型都定义一个原生态类型(raw type),即不带任何实际类型参数的泛型名称。 如果使用原生态类型,就失掉了泛型在安全性和表述性方面的所有优势。 如果List这样的原生态类型,就原创 2015-09-13 21:14:51 · 369 阅读 · 0 评论 -
第3章 对于所有对象都通用的方法
第8条:覆盖equals时请遵守通用约定 覆盖equals方法看起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果非常严重。最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下, 类的每个实例都只与它自身相等。如果满足了以下任何一个条件,这就正是所期望的结果: 类的每个实例本质上都是唯一的。对于代表活动实体而不是值(value)的类来说确实如此,例如Thread。Ob原创 2015-09-11 16:41:52 · 304 阅读 · 0 评论 -
第2章 创建和销毁对象
第一条:考虑用静态工厂方法代替构造器 类可以通过静态工厂与设计模式来提供它的客户端,而不是通过构造器。提供静态工厂方法而不是公有的构造器,这样做具有几大优势。 静态工厂方法与构造器不同的第一大优势在于,它们有名称。如果构造器的参数本身没有确切地描述正被返回的对象,那么具有适当名称的静态工厂更容易 使用,产生的客户端代码也更于阅读。原创 2015-09-11 15:26:39 · 342 阅读 · 0 评论 -
第10章 并发
第66条:同步访问共享的可变数据 你可能听说过,为了提高性能,在读或写原子数据的时候,应该避免使用同步。这个建议是非常危险而错误的。虽然语言规范保证了线程在读取原子数据的时候, 不会看到任意的数值,但是它并不保证一个线程写入的值对于另一个线程将是可见的。为了在线程之间进行可靠的通信,也为了互斥访问,同步是必要的。这归因 于Java语言规范中的内存模型(memory model),它规原创 2015-09-18 16:12:34 · 464 阅读 · 0 评论