
Effective-Java笔记
文章平均质量分 68
笔记
越知越无知
任何学习都是这么一个过程,以点入面,不断地明白自己是多么无知和弱小,然后再不断地学习给与自己成就感,直到回首过去发现已经处于完全不同的高度。
展开
-
Effective Java笔记第五章枚举和注解第六节注解优先于命名模式
Effective Java笔记第五章枚举和注解第六节注解优先于命名模式原创 2021-08-13 11:21:04 · 162 阅读 · 0 评论 -
Effective Java笔记第五章枚举和注解第五节用接口模拟可伸缩的枚举
Effective Java笔记第五章枚举和注解第五节用接口模拟可伸缩的枚举1.操作码是指这样的枚举类型:他的元素表示在某种机器上的那些操作。由于枚举类型可以通过给操作码类型和(属于接口的标准实现)枚举定义接口,来实现任意接口,基本的想法就是利用这一事实。下面我们举个例子:public interface Operation { double apply(double x, double y);}public enum BasicOperation implements Operat原创 2021-08-10 21:24:36 · 123 阅读 · 0 评论 -
Effective Java笔记第五章枚举和注解第四节用EnumMap代替序数索引
Effective Java笔记第五章枚举和注解第四节用EnumMap代替序数索引1.我们举个例子:public class Herb { public enum Type { ANNUAL, PERENNIAL, BIENNIAL; } private final String name; public final Type type; public Herb(String name, Type type) { this.原创 2021-08-08 21:57:54 · 179 阅读 · 1 评论 -
Effective Java笔记第五章枚举和注解第三节用EnumSet代替位域
Effective Java笔记第五章枚举和注解第三节用EnumSet代替位域在以前如果一个枚举类型的元素主要用在集合中,一般就会使用int枚举模式。比如说:public class Demo { public static final int STYLE_BOLD = 1 << 0;//1 public static final int STYLE_ITALIC = 1 << 1;//2 public static final int STYLE_U原创 2021-08-07 11:44:22 · 173 阅读 · 0 评论 -
Effective Java笔记第五章枚举和注解第二节用实例域代替序数
Effective Java笔记第五章枚举和注解第二节用实例域代替序数许多枚举天生就与一个单独的int值相关联。所有的枚举都有一个ordinal方法,他返回每个枚举常量在类型中的数字位置。下面是Enum类的部分源码:public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable { private final int ord原创 2021-08-01 19:54:08 · 135 阅读 · 0 评论 -
Effective Java笔记第五章枚举和注解第一节用enum代替int常量
Effective Java笔记第五章枚举和注解第一节用enum代替int常量1.枚举类型是指由一组固定的常量组成合法值的类型,例如:一年中的季节,太阳系中的行星或者一副牌中的花色。在编程语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具名的int常量,每个类型成员一个常量:public class Demo { public static final int APPLE_FUJI=0; public static final int APPLE_PIPPIN=1;原创 2021-07-27 22:25:23 · 325 阅读 · 0 评论 -
Effective Java笔记第四章泛型第七节优先考虑类型安全的异构容器
Effective Java笔记第四章泛型第七节优先考虑类型安全的异构容器1.泛型最常用于集合,如Set和Map,以及单元素的容器,如ThreadLocal和AtomicReference。在这些用法中,它都充当被参数化了的容器。这样就限制了你每个容器只能有固定数目的类型参数。一般来说,这种情况正是我们想要的。例如:一个Set只有一个类型参数,表示他的元素类型;一个Map有两个类型参数,表示他的键和值类型。2.有时候会需要更多的灵活性,这时候就有一种方法可以很容易的做到,就是将键进行参数化而不是将容器原创 2021-07-25 21:50:24 · 136 阅读 · 0 评论 -
Effective Java笔记第四章泛型第六节利用有限制通配符来提升API的灵活性
Effective Java笔记第四章泛型第六节利用有限制通配符来提升API的灵活性1.参数化类型是不可变得,对于任何两个截然不同的类型Type1和Type2而言,List< Type1 >既不是List< Type2 >的子类型,也不是他的超类型。2.有时候,我们需要的灵活性要比不可变类型所能提供的更多,比如说:public class Stack<E> { private E[] element; private int size = 0;原创 2021-07-22 18:16:40 · 176 阅读 · 1 评论 -
Effective Java笔记第四章泛型第四节优先考虑泛型
Effective Java笔记第四章泛型第四节优先考虑泛型下面我们举个例子,将他作为泛型化的主要备选对象,换句话说,可以适当的强化这个类来利用泛型。public class Stack { private Object[] element; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 1; public Stack() { element = n原创 2021-07-14 21:57:42 · 203 阅读 · 1 评论 -
Effective Java笔记第四章泛型第三节列表优先于数组
Effective Java笔记第四章泛型第三节列表优先于数组1.数组与泛型相比,有两个重要的不同点。首先,数组是协变的(如果Sub为Super的子类型,那么数组类型Sub[ ]就是Subper[ ]的子类型)。相反,泛型是不可变的:对于任意两个不同的类型Type1和Type2,List既不是List的子类型,也不是List的超类型。两者相比数组是有缺陷的。我们举个例子:public class Demo { public static void main(String[] args) {原创 2021-07-12 20:47:04 · 302 阅读 · 0 评论 -
Effective Java笔记第四章泛型第二节消除非受检警告
Effective Java笔记第四章泛型第二节消除非受检警告1.用泛型编程时,会遇到许多编译器警告:非受检强制转化警告,非受检方法调用警告,非受检普通数组创建警告,以及非受检转换警告。当你越来越熟悉泛型之后,遇到的警告也会越来越少。2.当你遇到需要进行一番思考的警告时,要坚持住。要尽可能的消除每一个非受检警告。如果消除了所有警告,就可以确保代码是类型安全的,这是一件很好的事情。这意味着不会在运行时出现ClassCastException异常,你会更加自信自己的程序可以实现预期的功能。3.如果无法消原创 2021-07-08 20:57:38 · 777 阅读 · 0 评论 -
Effective Java笔记第四章泛型第一节请不要在新代码中使用原生态类型
Effective Java笔记第四章泛型第一节请不要在新代码中使用原生态类型1.在没有泛型之前,从集合中读取到每一个对象都必须进行转换。如果有人不小心插入了类型错误的对象,在运行时的转换处理就会出错。有了泛型之后,可以告诉编译器每个集合中接受哪些对象类型。编译器自动地为你的插入进行转换,并在编译时告知是否插入了类型错误的对象。这样就可以使程序更加安全和清楚。2.声明中具有一个或者多个类型参数的类或者接口,就是泛型类或者接口。从java1.5开始,List接口就只有单个类型参数E,表示列表的元素类型,原创 2021-04-08 19:33:21 · 224 阅读 · 1 评论 -
Effective Java笔记第三章类和接口第十节优先考虑静态成员类
Effective Java笔记第三章类和接口第十节优先考虑静态成员类1.嵌套类是指被定义在另一个类的内部类。嵌套类存在的目的应该只是为他的外围类提供服务。如果嵌套类将来可能会用于其他的某个环境,他就应该是顶层类。嵌套类有四种:静态成员类,非静态成员类,匿名类和局部类。除了静态成员类之外,其他三种都被称为内部类。2.静态成员类是最简单的一种嵌套类。最好把它看作是普通的类,只是碰巧被声明在另一个类的内部而已,他可以访问外围类的所有成员,包括那些声明为私有的成员。静态成员类是外围类的一个静态成员,与其他的原创 2021-03-29 19:03:13 · 120 阅读 · 0 评论 -
Effective Java笔记第三章类和接口第九节用函数对象表示策略
Effective Java笔记第三章类和接口第九节用函数对象表示策略1.调用对象上的方法通常是执行该对象上的某项操作。然而,我们也可能定义这样一种对象,他的方法执行其他对象(这些对象被显示传递给这些方法)上的操作。如果一个类仅仅导出这样的一个方法,他的实例实际上就等同于一个指向该方法的指针。这样的实例被称为函数对象。比如:public class StringLengthComparator { public int compare(String s1, String s2) {原创 2021-03-24 18:59:46 · 123 阅读 · 0 评论 -
Effective Java笔记第三章类和接口第八节类层次优于标签类
Effective Java笔记第三章类和接口第八节类层次优于标签类1.有时候,可能会遇到带有两种甚至更多种风格的实例的类,并包含表示实例风格的标签域。比如说:public class Figure { enum Shape{ RECTANGLE,CIRCLE }; //Tag field - the shape of this figure //标签字段-这个图形的形状 final Shape shape; //These fie原创 2021-03-18 19:10:22 · 97 阅读 · 0 评论 -
Effective Java笔记第三章类和接口第七节接口只用于定义类型
Effective Java笔记第三章类和接口第七节接口只用于定义类型1.当类实现接口时,接口就充当可以引用这个类的实例的类型。因此,类实现了接口,就表明客户端可以对这个类的实例实施某些动作。为了任何其他目的而定义接口是不恰当的。2.有一种接口被称为常量接口,他不满足上面的条件。这种接口没有包含任何方法,它只包含静态的final域,每个域都导出一个常量。使用这些常量的类实现这个接口,以避免用类名来修饰常量名。下面我们举个例子:public interface PhysicalConstants {原创 2021-03-15 19:08:07 · 110 阅读 · 0 评论 -
Effective Java笔记第三章类和接口第六节接口优于抽象类
Effective Java笔记第三章类和接口第六节接口优于抽象类1.java程序设计语言提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类。这两种机制之间最明显的区别在于,抽象类允许包含某些方法的实现,但是接口则不允许,一个更为重要的区别在于,为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。任何一个类,只要它定义了所有必要的方法,并且遵守通用约定,他就被允许实现一个接口,而不管这个类是处于类层次的哪个位置。因为java只允许单继承,所以,抽象类作为类型定义受到了极大的限制。2.现有原创 2021-03-11 20:25:42 · 200 阅读 · 2 评论 -
Effective Java笔记第三章类和接口第五节要么为继承而设计,并提供文档说明,要么就禁止继承
Effective Java笔记第三章类和接口第五节要么为继承而设计,并提供文档说明,要么就禁止继承1.对于专门为了继承而设计并具有良好文档说明的类而言,首先,该类的文档必须精确地描述覆盖每个方法所带来的影响。换句话说,该类必须有文档说明它可覆盖的方法的自用性。对于每个公有的或受保护的方法或者构造器,他的文档必须指明该方法或者构造器调用了哪些可覆盖的方法,是以什么顺序调用的,每个调用的结果又是如何影响后续的处理过程的(所谓可覆盖的方法,是指非final的,公有的或受保护的)。更一般地,类必须在文档中说明原创 2021-03-09 20:48:38 · 176 阅读 · 0 评论 -
Effective Java笔记第三章类和接口第四节复合优先于继承
Effective Java笔记第三章类和接口第四节复合优先于继承1.继承是实现代码重用的有力手段,但是并非永远是完成这项工作的最佳工具。使用不当会导致软件变得很脆弱。在包的内部使用继承是非常安全的,在那里,子类和超类的实现都处于同一个程序员的控制之下。对于专门为了继承而设计,并且具有很好的文档说明的类来说,使用继承也是非常安全的。然而,对于普通的具体类进行跨越包边界的继承,则是非常危险的。本文的继承只实现继承(当一个类扩展另一个类时),并不适用于接口继承(当一个类实现一个接口时)。2.与方法调用不同原创 2021-03-07 22:08:41 · 156 阅读 · 1 评论 -
Effective Java笔记第三章类和接口第三节使可变性最小化
Effective Java笔记第三章类和接口第三节使可变性最小化1.不可变类只是其实例不能被修改的类。每个实例中包含的所有信息都必须在创建该实例的时候就提供,并在对象的整个生命周期内固定不变。62.不可变类需要遵守的规则:1)不要提供任何会修改对象状态的方法。2)保证类不会被扩展。这样可以防止粗心或者恶意的子类假装对象的状态已经改变,从而破坏该类的不可变行为。为了防止子类化,一般做法是使这个类成为final的。3)使所有的域都是final的。通过系统的强制方式,这可以清楚地表明你的意图。而且,原创 2021-03-05 20:09:18 · 144 阅读 · 0 评论 -
Effective Java笔记第三章类和接口第二节在公有类中使用访问方法而非公有域
Effective Java笔记第三章类和接口第二节在公有类中使用访问方法而非公有域1.有时候可能会编写一些退化类,没什么作用,只是用来集中实例域,比如说:class Point { public double x; public double y; }由于这种类的数据可以被直接访问,这些类没有提供封装的功能。如果不改变API,就无法改变它的数据表示法,也无法强加任何约束条件,当域被访问的时候,无法采取任何辅助行动。这是不可取的,对于可变的类来说,应该用包含私有原创 2021-03-02 19:47:17 · 130 阅读 · 0 评论 -
Effective Java笔记第三章类和接口第一节使类和成员的可访问性最小化
Effective Java笔记第三章类和接口第一节使类和成员的可访问性最小化1.设计良好的模块会隐藏所有的实现细节,把他的API与他的实现清晰地隔离开来。然后,模块之间只通过他们的API进行通信,一个模块不需要知道其他模块的内部工作情况。这个概念被称为信息隐藏或封装,是软件设计的基本原则之一。2.信息隐藏可以有效地解除组成系统的各模块之间的耦合关系,使得这些模块可以独立的开发,测试,优化,使用,理解和修改。这样可以加快系统开发的速度,因为这些模块可以并行开发。3.Java程序设计语言提供了许多机制原创 2021-02-28 19:17:53 · 142 阅读 · 0 评论 -
Effective Java笔记第二章对所有对象都通用的方法第五节考虑实现Comparable接口
Effective Java笔记第二章对所有对象都通用的方法第五节考虑实现Comparable接口1.compareTo方法并没有在Object中声明,相反,他是Comparable接口中唯一的方法。compareTo方法不但允许进行简单的等同性比较,而且允许执行顺序比较,除此之外他与Object的equals方法具有相似的特征,他还是个泛型。2.一旦实现了Comparable接口,他就可以和许多泛型算法以及依赖于该接口的集合实现进行协作,付出很小的努力就可以获得非常强大的功能。事实上,Java平台类原创 2021-02-24 17:07:34 · 164 阅读 · 2 评论 -
Effective Java笔记第二章对所有对象都通用的方法第三节始终要覆盖toString
Effective Java笔记第二章对所有对象都通用的方法第三节始终要覆盖toString1.toString的通用约定指出,被返回的字符串应该是一个"简洁的,但信息丰富并且易于阅读的表达形式",“建议所有的子类都覆盖这个方法”。2.提供好的toString实现可以使类用起来更加舒适,当对象被传递给println,printf,字符串练操作符(+)以及assert或者被调试器打印出来的时候,toString方法就会被自动调用。3.在实际应用中,toString方法应该返回对象中包含的所有指的关注的原创 2021-02-22 19:04:29 · 135 阅读 · 0 评论 -
Effective Java笔记第二章对所有对象都通用的方法第二节覆盖equals时总要覆盖hashCode
Effective Java笔记第二章对所有对象都通用的方法第二节覆盖equals时总要覆盖hashCode1.在每个覆盖了equals方法的类中,也必须覆盖hashCode方法,如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap,HashSet和Hashtable。2.Object.hashCode的通用约定:1)在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对原创 2021-02-18 14:38:07 · 166 阅读 · 0 评论 -
Effective Java笔记第二章对所有对象都通用的方法第一节覆盖equals时请遵守通用约定
Effective Java笔记第二章对所有对象都通用的方法第一节覆盖equals时请遵守通用约定1.最容易避免覆盖equals方法错误的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只会与它自身相等,满足以下任何一个条件都不需要覆盖equals方法:1)类的每个实例本质上都是唯一的:对于代表活动实体而不是值的类来说就是这样。2)不关心类是否提供了"逻辑相等"的测试功能。3)超类(被继承的类)已经覆盖了equals,从超类继承过来的行为对于子类也是适合的。...原创 2021-01-25 16:01:37 · 158 阅读 · 0 评论 -
Effective Java笔记第一章创建和销毁对象第七节避免使用终结方法
Effective Java笔记第一章创建和销毁对象第七节避免使用终结方法1.终结方法通常是不可预测的,也是很危险的,一般情况下是不必要的。使用终结方法会导致行为不稳定,降低性能,以及可移植性问题。2.C++的析构器可以被用来回收其他的非内存资源,而在java中,一般使用try-finally块来完成类似的工作。3.终结方法的缺点在于不能保证会被及时地执行,从一个对象变得不可到达开始,到他的终结方法被执行,所花费的这段时间是任意长的。这意味着,注重时间的任务不应该由终结方法来完成。除此之外,也不应该原创 2021-02-04 19:16:12 · 161 阅读 · 2 评论 -
Effective Java笔记第一章创建和销毁对象第六节消除过期的对象引用
Effective Java笔记第一章创建和销毁对象第六节消除过期的对象引用1.如果一个栈先增长,然后收缩,那么从栈中弹出的对象将不会被当做垃圾回收,即使使用栈的程序不再引用这些对象,他们也不会被回收。应为栈内部维护着对这些对象的过期引用。过期引用是指永远也不会再被解除的引用。public class Demo1 { private Object[] elements; private int size=0; private static final int DEFAULT_原创 2020-12-18 10:02:25 · 182 阅读 · 0 评论 -
Effective Java笔记第一章创建和销毁对象第五节避免创建不必要的对象
Effective Java笔记第一章创建和销毁对象第五节避免创建不必要的对象1.列举一个比较常见的例子。修改前:public class Demo1 { private final Date birthday; public Demo1(Date birthday) { this.birthday = birthday; } //不可取,每一次调动都会新建一个Calendar,一个TimeZone和两个Date public B原创 2021-01-11 18:36:32 · 152 阅读 · 2 评论 -
Effective Java笔记第一章创建和销毁对象第四节通过私有构造器强化不可实例化的能力
Effective Java笔记第一章创建和销毁对象第四节通过私有构造器强化不可实例化的能力1.很多工具类不希望被实例化,实例对他没有任何意义。在缺少显式构造器的情况下,编译器会自动提供一个公有的,无参的缺省构造器(default constructor).2.企图通过将类做成抽象类来强制该类不可被实例化,这是行不通的。该类可以被子类化,并且该子类可以被实例化。...原创 2021-01-06 18:47:13 · 147 阅读 · 1 评论 -
Effective Java笔记第一章创建和销毁对象第三节用私有构造器或者枚举类型强化Singleton属性
Effective Java笔记第一章创建和销毁对象第三节用私有构造器或者枚举类型强化Singleton属性1.Singleton指仅仅被实例化一次的类。使类成为Singleton会使他的客户端测试变得十分困难。Java1.5之前,实现Singleton有两种方法,这两种方法都要把构造器保持为私有的,并导出公有的静态成员变量,以便允许客户端能访问该类的唯一实例。2.公有静态成员是个final域public class Demo1 { //公有静态成员final域 public sta原创 2020-12-12 21:41:26 · 173 阅读 · 1 评论 -
Effective Java笔记第一章创建和销毁对象第二节遇到多个构造器参数时要考虑用构建器
Effective Java笔记第一章创建和销毁对象第二节:遇到多个构造器参数时要考虑用构建器1.重叠构造器模式:提供第一个只有必要参数的构造器,第二个构造器有一个可选参数,以此类推,最后一个构造器包含所有的可选参数。public class Demo1 { private final int a; private final int b; private final int c; private final int d; //两个参数的构造方法 p原创 2020-12-07 20:53:13 · 188 阅读 · 5 评论 -
Effective Java笔记第一章创建和销毁对象第一节考虑用静态工厂方法代替构造器
Effective Java笔记第一章引言1.java语言支持四种类型:接口(interface),类(class),数组(array)和基本类型(primitive)。2.接口(interface),类(class),数组(array)被称为引用类型,类实例和数组是对象。3.类的成员由他的域(field),方法(method),成员类(member class)和成员接口(member interface)组成。4.方法的签名(signature)由它的名称和所有参数类型组成,不包括返回类型。原创 2020-12-02 19:56:10 · 219 阅读 · 0 评论