读书笔记(Java)
文章平均质量分 59
贰叁!
这个作者很懒,什么都没留下…
展开
-
利用有限制性通配符来提高API的灵活性——《effective Java》第三版
为了获得最大限度的灵活性,要在表示生产者或者消费者的输入参数上使用通配符类型。如果某个输入参数既是生产者,又是消费者,那么通配符类型对你就没有什么好处了:因为你需要的是严格的类型匹配,这是不用任何通配符而得到的。下面的助记符便于让你记住要使用哪种通配符类型:PECS 表示 producer-extends,consumer-super。 换句话说,如果参数化类型表示一个生产者 T,就使用<?extends T>;如果它表示一个消费者 T,就使用<?super...原创 2022-04-08 11:46:47 · 149 阅读 · 0 评论 -
消除非受检警告——《软件工程:实践者的研究方法》第三版
有些警告非常难以消除。本章主要介绍这种警告示例。当你遇到需要进行一番思考的警告时,要坚持住!要尽可能地消除每一个非受检警告。如果消除了所有警告,就可以确保代码是类型安全的,这是一件很好的事情。这意味着不会在运行时出现 Class-Cast-Exception 异常,你会更加自信自己的程序可以实现预期的功能。 如果无法消除警告,同时可以证明引起警告的代码是类型安全的,(只有在这种情况下)才可以用一个 @suppresswarnings(“unchecked”)注解来禁止这条警告...原创 2022-04-07 16:33:29 · 90 阅读 · 0 评论 -
请不要使用原生态类型——《effective Java》第三版
如上所述,使用原生态类型(没有类型参数的泛型)是合法的,但是永远不应该这么做。如果使用原生态类型,就失掉了泛型在安全性和描述性方面的所有优势。既然不应该使用原生态类型,为什么 Java 语言的设计者还要允许使用它们呢?这是为了提供兼容性。因为泛型出现的时候,Java 平台即将进入它的第二个十年,已经存在大量没有使用泛型的Java 代码。人们认为让所有这些代码保持合法,并且能够与使用泛型的新代码互用,这一点很重要。它必须合法才能将参数化类型的实例传递给那些被设计成使用普通类型的方法,反之亦然...原创 2022-04-06 16:50:13 · 279 阅读 · 0 评论 -
静态成员类优于非静态成员类——《effective Java》第三版
嵌套类(nested class)是指定义在另一个类的内部的类。嵌套类存在的目的应该只是为它的外围类(enclosing class)提供服务。如果嵌套类将来可能会用于其他的某个环境中,它就应该是顶层类(top-level class)。嵌套类有四种:静态成员类(static member class)、非静态成员类(nonstatic member class)、匿名类(anonymous class)和局部类(local class)。除了第一种之外,其他三种都称为内部类(inner c...原创 2022-04-05 13:57:02 · 296 阅读 · 0 评论 -
类层次优于标签类——《effective Java》第三版
有时可能会遇到带有两种甚至更多种风格的实例的类,并包含表示实例风格的标签(tag)域。例如,以下面这个类为例,它能够表示圆形或者矩形: 这种标签类(tagged class)有许多缺点。它们中充斥着样板代码,包括枚举声明、标签域以及条件语句。由于多个实现乱七八糟地挤在单个类中,破坏了可读性。由于实例承担着属于其他风格的不相关的域,因此内存占用也增加了。域不能做成 final 的,除非构造器初始化了不相关的域,产生了更多的样板代码。构造器必须不借助编译器来设置...原创 2022-04-04 14:41:50 · 242 阅读 · 0 评论 -
接口只用于定义类型——《effective Java》第三版
当类实现接口时,接口就充当可以引用这个类的实例的类型(type)。因此,类实现了接口,就表明客户端可以对这个类的实例实施某些动作。为了任何其他目的而定义接口是不恰当的。 有一种接口被称为常量接口(constant interface),它不满足上面的条件。这种接口不包含任何方法,它只包含静态的 final 域,每个域都导出一个常量。使用这些常量的类实现这个接口,以避免用类名来修饰常量名。 常量接口模式是对接口的不良使用。类在内部使用某些常量,这纯粹是实现细节。...原创 2022-04-03 21:07:43 · 437 阅读 · 0 评论 -
接口优于抽象类——《effective Java》第三版
Java 提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类。自从 Java 为继承引人了缺省方法(default method),这两种机制都允许为某些实例方法提供实现。主要的区别在于,为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。因为 Java只允许单继承,所以用抽象类作为类型定义受到了限制。任何定义了所有必要的方法并遵守通用约定的类,都允许实现一个接口,无论这个类是处在类层次结构中的什么位置。 现有的类可以很容易被更新,以实现新的接口。如果这些方法...原创 2022-04-02 22:55:38 · 730 阅读 · 0 评论 -
要么设计继承并提供文档说明,要么禁止继承——《effective Java》 第三版
为了继承而进行的设计不仅仅涉及自用模式的文档设计。为了使程序员能够编写出更加有效的子类,而无须承受不必要的痛苦,类必须以精心挑选的受保护的(protected)方法的形式,提供适当的钩子(hook),以便进入其内部工作中。这种形式也可以是罕见的实例,或者受保护的域。例如,以java.util.AbstractList 中的 removeRange 方法为例:protected void removeRange(int fromIndex, int toIndex) (从列...原创 2022-04-01 16:34:05 · 592 阅读 · 0 评论 -
复合优先于继承——《effective Java》第三版
不扩展现有的类,而是在新的类中增加一个私有域,它引用现有类的一个实例。这种设计被称为“复合”(composition),因为现有的类变成了新类的一个组件。新类中的每个实例方法都可以调用被包含的现有类实例中对应的方法,并返回它的结果。这被称为转发(forwarding),新类中的方法被称为转发方法(forwarding method)。这样得到的类将会非常稳固,它不依赖于现有类的实现细节。即使现有的类添加了新的方法,也不会影响新的类。为了进行更具体的说明,请看下面的例子,它用复合/转发的方法来...原创 2022-03-31 16:44:12 · 511 阅读 · 0 评论 -
使可变性最小化——《effective Java》第三版
为了使类成为不可变,要遵循下面五条规则:1.不要提供任何会修改对象状态的方法(也称为设值方法)。2.保证类不会被扩展。这样可以防止粗心或者恶意的子类假装对象的状态已经改变,从而破坏该类的不可变行为。为了防止子类化,一般做法是声明这个类成为final的,但是后面我们还会讨论到其他的做法。3.声明所有的域都是final的。通过系统的强制方式可以清楚地表明你的意图。而且,如果一个指向新创建实例的引用在缺乏同步机制的情况下,从一个线程被传递到另一个线程,就必须确保正确的行为,...原创 2022-03-29 20:46:24 · 633 阅读 · 0 评论 -
要在公有类而非公有域中使用访问方法——《effective Java》第三版
毫无疑问,说到公有类的时候,坚持面向对象编程思想的看法是正确的:如果类可以在它所在的包之外进行访问,就提供访问方法,以保留将来改变该类的内部表示法的灵活性。如果公有类暴露了它的数据域,要想在将来改变其内部表示法是不可能的,因为公有类的客户端代码已经遍布各处了。 然而,如果类是包级私有的,或者是私有的嵌套类,直接暴露它的数据域并没有本质的错误——假设这些数据域确实描述了该类所提供的抽象。无论是在类定义中,还是在使用该类的客户端代码中,这种方法比访问方法的做法更不容易产生视觉...原创 2022-03-28 15:13:39 · 581 阅读 · 0 评论 -
使类和成员的可访问性最小化——《effective Java》第三版
对于成员(域、方法、嵌套类和嵌套接口)有四种可能的访问级别,下面按照可访问性的递增顺序罗列出来: 私有的(private)——只有在声明该成员的顶层类内部才可以访问这个成员。 包级私有的(package-private)——声明该成员的包内部的任何类都可以访问这个成员。从技术上讲,它被称为“缺省”(default)访问级别,如果没有为成员指定访问修饰符,就采用这个访问级别(当然,接口成员除外,它们默认的访问级别是公有的)。 受保护的(protected)——声...原创 2022-03-27 22:56:04 · 558 阅读 · 0 评论 -
考虑实现 Comparable 接口——《effective Java》第三版
compareTo方法并没有在Object类中声明。相反,它是Comparable接口中唯一的方法。compareTo方法不但允许进行简单的等同性比较,而且允许执行顺序比较,除此之外,它与Object的equals方法具有相似的特征,它还是个泛型(generic)。类实现了Comparable接口,就表明它的实例具有内在的排序关系(naturalordering)。为实现Comparable接口的对象数组进行排序就这么简单:Arrays.sort(a);对存储在集...原创 2022-03-26 15:27:26 · 90 阅读 · 0 评论 -
覆盖 equals 时请遵守通用约定——《effective Java》第三版
覆盖 equals 方法看起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果非常严重。最容易避免这类问题的办法就是不覆盖 equals 方法,在这种情况下,类的每个实例都只与它自身相等。如果满足了以下任何一个条件,这就正是所期望的结果: 类的每个实例本质上都是唯一的。对于代表活动实体而不是值(value)的类来说确实如此,例如 Thread。Object 提供的 equals 实现对于这些类来说正是正确的行为。 类没有必要提供“逻辑相等”(logical...原创 2022-03-24 16:39:38 · 529 阅读 · 0 评论 -
遇到多个构造器参数时要考虑使用构建——《effective Java》
静态工厂和构造器有个共同的局遇到多个构造器参数时要考虑使用构建器限性:它们都不能很好地扩展到大量的可选参数。因此,对于解决这一类问题,程序员一向习惯采用重叠构造器(telescopingconstructor)模式,在这种模式下,提供的第一个构造器只有必要的参数,第二个构造器有一个可选参数,第三个构造器有两个可选参数,依此类推,最后一个构造器包含所有可选的参数。重叠构造器模式虽然可行,但是当有许多参数的时候,客户端代码会很难编写,并且仍然较难以阅读。 与构造器相比,buil...原创 2022-03-15 21:57:28 · 649 阅读 · 0 评论 -
静态工厂方法不同于构造器的优势——《effective Java》第三版
对于类而言,为了让客户端获取它自身的一个实例,最传统的方法就是提供一个公有的构造器。还有一种方法,也应该在每个程序员的工具箱中占有一席之地。类可以提供一个公有的静态工厂方法(staticfactorymethod),它只是一个返回类的实例的静态方法。 ①静态工厂方法与构造器不同的第一大优势在于,它们有名称。如果构造器的参数本身没有确切地描述正被返回的对象,那么具有适当名称的静态工厂会更容易使用,产生的客户端代码也更易于阅读。 ②静态工厂方法与...原创 2022-03-13 22:37:22 · 1089 阅读 · 0 评论