Effective Java
文章平均质量分 92
iteye_11305
这个作者很懒,什么都没留下…
展开
-
静态工厂方法VS构造器
原文链接 作者:Jose Luis 译者:yxiaomou我之前已经介绍过关于构建者模式 (Builder Pattern)的一些内容,它是一种很有用的模式用于实例化包含几个属性(可选的)的类,带来的好处是更容易读、写及维护客户端代码。今天,我将继续介绍对象创建技术。在我看来,下面这个类是非常有用的例子。有一个RandomIntGenerator 类,产生随机的int类型的整数。如下所示:...原创 2016-08-06 11:46:51 · 89 阅读 · 0 评论 -
请不要在新代码中使用原生态类型
A:原生态类型如 List:不带任何类型参数的泛型名称B:参数化类型如List<String> :表示元素类型为String的列表C:无限制的通配符类型如List<?>:表示元素为未知类型 参数化类型优点1)安全,提供了编译前检查2)方便,不用显示的cast,自动完成原生态类型存在的主要目的是兼容性。 List和List<Obj...原创 2016-08-08 20:50:47 · 81 阅读 · 0 评论 -
用enum代替int常量
用法一:常量在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:switchJDK1.6之前的switch语句只支持...原创 2016-08-09 21:38:54 · 239 阅读 · 0 评论 -
返回零长度的数组或者集合,而不是null
如果一个方法的返回值类型是集合或者数组 ,如果在方法内部需要返回的集合或者数组是零长度的,也就是没有实际对象在里面,我们也应该放回一个零长度的数组或者集合,而不是返回null。如果返回了null,客户端程序员就要检测返回的是不是null,然后才能进行下一步操作,否则就会引发NullPointException。但是如果是返回的的是空数组或者集合,就不会再后续的使用这个对象上,引发空指针异常,我...原创 2016-08-09 21:39:32 · 172 阅读 · 0 评论 -
Java函数中的参数有效性检查
在Java程序中,方法与属性是类中最基本的成员。下面的问题与方法有关:实现一个方法的第一步是什么?说到这里我突然想起侯耀文、赵丽蓉两位艺术家在小品《英雄母亲的一天》中有这样一段台词:导演:您起床后做的第一件事是什么?可以随便说。大娘一听可以随便说,笑了。大娘(凑到导演的耳朵边,轻声地):上厕所。在这里,我也想做一回导演,把上面的台词改一下:编程新手:您在实现类中的一个方法时...原创 2016-08-09 21:41:39 · 608 阅读 · 0 评论 -
java方法重载(慎用重载)
1.什么是方法重载 方法名字相同,参数类型或者参数个数不同2.下面我们先看下面这段代码 [java] view plain copy print?public class CollectionClassifier { public static String classify(Set<?> s) { ...原创 2016-08-09 21:41:52 · 379 阅读 · 0 评论 -
Java 增强型的for循环 for each
For-Each循环 For-Each循环也叫增强型的for循环,或者叫foreach循环。 For-Each循环是JDK5.0的新特性(其他新特性比如泛型、自动装箱等)。 For-Each循环的加入简化了集合的遍历。 其语法如下: for(type element: array) { System.out.println(element...原创 2016-08-09 21:42:18 · 101 阅读 · 0 评论 -
精确运算避免使用float和double
1. 概述float和double类型的主要设计目的是为了科学计算和工程计算。它们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。float和double类型对于货币计算尤为不合适,因为要让一个float或者double精确地表示0.1(或者10的任何负数次方值)是不可能的,比如Sys...原创 2016-08-10 21:33:38 · 941 阅读 · 0 评论 -
基本类型优先于装箱基本类型
Java有一个类型系统由两部分组成,包含基本类型(primitive),如int、double和boolean,和引用类型(reference type),如String和List。每个基本类型都有一个对应的引用类型,称为装箱基本类型(boxed primitive)。Java 1.5版本中加入了自动装箱(autoboxing)和自动拆箱(auto-unboxing)。int i = new ...原创 2016-08-10 21:33:55 · 85 阅读 · 0 评论 -
当心字符串连接的性能(关于String及StringBuilder的几点区别)
对于JAVA的字符串连接操作符(+)相信大家都十分熟悉 ,它的作用是把多个字符串合并为一个字符串,当然我们使用它是非常方便的 ,但它确不适合运用在大规模的场景中 。 下面我们通过程序说明一下:假设我们有一个需求会对字符串进行数量很大连接操作如果我们使用String进行操作,由于 String是不可变的,每次进行用(+)连接时都相当于重新创建了一个对象这无疑是相当耗时的,以下...原创 2016-08-10 21:36:45 · 95 阅读 · 0 评论 -
有效处理Java异常三原则
Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮、易于调试。异常之所以是一种强大的调试手段,在于其回答了以下三个问题:什么出了错?在哪出的错?为什么出错?在有效使用异常的情况下,异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息回答了“为什么“会抛出,如果你的异常没有回答以上全部问题,那么可能你没有很好地使用它们。有...原创 2016-08-10 21:37:01 · 77 阅读 · 0 评论 -
类层次优于标签类
有时候,可能会遇到带有两个甚至更多风格的实例的类,并包含表示实例风格的标签(tag)域。Demo: [java] view plain copy // Tagged class - vastly inferior to a class hierarchy! class Figure { enum Shape { RECTANGLE, CI...原创 2016-08-08 20:50:31 · 109 阅读 · 0 评论 -
Java Interface(接口) 是常量存放的最佳地点吗?
由于java interface中声明的字段在编译时会自动加上static final的修饰符,即声明为常量。因而interface通常是存放常量的最佳地点。然而在java的实际应用时却会产生一些问题。问题的起因有两个,第一,是我们所使用的常量并不是一成不变的,而是相对于变量不能赋值改变。例如我们在一个工程初期定义常量∏=3.14,而由于计算精度的提高我们可能会重新定义∏=3.14159,...原创 2016-08-08 20:50:13 · 396 阅读 · 0 评论 -
优先考虑类型安全的异构容器
一般情况下,泛型最通常应用于集合,如set和Map,以及单元素的容器,如ThreadLocal等。在这些语法中一般情况下,这些容器都被充当被参数化了的容器,意味着每个容器只能有一个或者多个固定数目的类型参数。如一个Set只有一个类型参数,用于表示元素类型。一个Map有两个类型参数,表示它的键和值类型。(个人认为类型参数就是指定了类型的参数。这也是泛型的意义所在) 但是...原创 2016-08-08 20:48:46 · 64 阅读 · 0 评论 -
多个构造函数参数时考虑用Builder模式
当创建对象需要传入多个参数的时候我们通常会根据参数的数量写不同的构造器,具体如下public A(int a){}public A(int a, int b){}public A(int a, int b, int c){}根据不同的参数调用不同的构造器,但是当参数多了的时候,这种方式不够灵活,所以会实现动态传参的方法public A(){}public void set...原创 2016-08-06 12:25:40 · 134 阅读 · 0 评论 -
用私有构造器或者枚举类型强化Singleton属性
在1.5版本之前可以两种实现Singleton的方法,但是都要把构造器保存为私有的。1、公有静态成员是个final域 // Singleton with public final field - Page 17 public class Elvis { public static final Elvis INSTANCE = new Elvis(...原创 2016-08-06 13:00:07 · 53 阅读 · 0 评论 -
通过私有构造器强化不可实例化的能力
你可能需要编写只包含静态方法和静态域的类。这样的工具类不希望被实例化,实例化对他没有任何意义。(企图通过将类做成抽象类来强制该类不可被实例化,这是行不通的)工具类(util)就是一类不该被实例化类的代表。它们只是提供一些实用功能,实例化之是毫无意义的。demo: // Noninstantiable utility class public class Utility...原创 2016-08-06 13:21:52 · 57 阅读 · 0 评论 -
避免创建不必要的对象
Java中Sting很特别,有如下两种初始化方式:(1).String s1 = “This isstring1”;(2).String s2 = new String(“Thisis string2”);第一种字符串初始化方式,当有多于一个字符串的内容相同情况,字符串内容会放在字符串缓冲池中,即字符串内容在内存中只有一份。第二种字符串初始化方式,不论有没有字符串值相同,每次都会...原创 2016-08-06 13:51:33 · 62 阅读 · 0 评论 -
JAVA中equals()的用法
需要覆盖equals:如果类具有自己特有的“逻辑相等”概念,而且超类还没有覆盖equals以实现期望的行为,这时我们就需要覆盖equals方法。 不需要覆盖equals:用实例受控确保“每个值至多只存在一个对象”的类。枚举类型就属于这种类。对于这样的类而言,逻辑相同与对象等同是一回事。 Object类中的equals方法用于检测一个对象是否等于另一个对象。在Object类中,这个方法...原创 2016-08-07 09:37:30 · 865 阅读 · 0 评论 -
始终要覆盖toString
java.lang.Object的toString方法的实现:public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode());}这通常不是用户期望看到的,它包含类名称,一个“@”符号,以及散列码的无符号十六进制表示法。 to...原创 2016-08-07 09:37:41 · 76 阅读 · 0 评论 -
谨慎地覆盖clone
Clone提供一种语言之外的机制:无需调用构造器就可以创建对象。它的通用约定非常弱:创建和返回该对象的一个拷贝。这个拷贝的精确含义取决于该对象的类。一般含义是,对于任何对象x,表达式x.clone() != x 将会是true,并且,表达式x.clone().getClass() == x.getClass() 将会是true,但这些不是绝对的要求,通常情况下,表达式 x.clone(...原创 2016-08-07 09:37:54 · 90 阅读 · 0 评论 -
消除过期的对象引用
下面这段程序存在一个“内存泄漏”。在极端的情况下,会导致磁盘交换(Disk Paging),甚至导致程序失败(OutOfMemoryError)。那么哪里引起的内存泄漏呢?如果一个栈先是增长,然后再收缩,那么从栈中弹出来的对象讲不会被当做垃圾回收,即使使用的栈程序不再引用这些对象。这是因为,栈内部维护着对这些对象的过期引用(obsolete reference)。过期引用是指,永远也不会再被接...原创 2016-08-07 09:39:47 · 90 阅读 · 0 评论 -
Comparable接口实现和使用方法
1.什么是Comparable接口此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。 强烈推荐(虽然不是必需的)使...原创 2016-08-07 09:40:35 · 666 阅读 · 0 评论 -
优先考虑泛型
看如下一个泛型的例子: [java] view plain copy // Initial attempt to generify Stack = won't compile! public class Stack<E> { private E[] elements; private int ...原创 2016-08-08 20:48:31 · 73 阅读 · 0 评论 -
java多线程中的volatile
一. volatite 简述Java 语言提供了一种稍弱的同步机制,即 volatile 变量.用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新. 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的. 二. volatite 线程安全?volatile 变量对所有线程是立即可见的,对 v...原创 2016-08-13 17:06:18 · 55 阅读 · 0 评论