From 20d72371a7185c706f49946dacf908a016743019 Mon Sep 17 00:00:00 2001 From: tilerlgt <5645442+tilerlgt@user.noreply.gitee.com> Date: Fri, 7 Feb 2020 15:10:58 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E4=B8=8D=E9=80=9A=E9=A1=BA=E7=9A=84=E5=9C=B0=E6=96=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\257\346\236\204\351\200\240\345\207\275\346\225\260.md" | 4 ++-- ...34\200\350\246\201\347\232\204\345\257\271\350\261\241.md" | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git "a/\347\254\25402\347\253\240\357\274\232\345\210\233\345\273\272\345\222\214\351\224\200\346\257\201\345\257\271\350\261\241/\347\254\2541\351\241\271\357\274\232\350\200\203\350\231\221\351\235\231\346\200\201\345\267\245\345\216\202\346\226\271\346\263\225\350\200\214\344\270\215\346\230\257\346\236\204\351\200\240\345\207\275\346\225\260.md" "b/\347\254\25402\347\253\240\357\274\232\345\210\233\345\273\272\345\222\214\351\224\200\346\257\201\345\257\271\350\261\241/\347\254\2541\351\241\271\357\274\232\350\200\203\350\231\221\351\235\231\346\200\201\345\267\245\345\216\202\346\226\271\346\263\225\350\200\214\344\270\215\346\230\257\346\236\204\351\200\240\345\207\275\346\225\260.md" index d9e070e..9ef3c93 100644 --- "a/\347\254\25402\347\253\240\357\274\232\345\210\233\345\273\272\345\222\214\351\224\200\346\257\201\345\257\271\350\261\241/\347\254\2541\351\241\271\357\274\232\350\200\203\350\231\221\351\235\231\346\200\201\345\267\245\345\216\202\346\226\271\346\263\225\350\200\214\344\270\215\346\230\257\346\236\204\351\200\240\345\207\275\346\225\260.md" +++ "b/\347\254\25402\347\253\240\357\274\232\345\210\233\345\273\272\345\222\214\351\224\200\346\257\201\345\257\271\350\261\241/\347\254\2541\351\241\271\357\274\232\350\200\203\350\231\221\351\235\231\346\200\201\345\267\245\345\216\202\346\226\271\346\263\225\350\200\214\344\270\215\346\230\257\346\236\204\351\200\240\345\207\275\346\225\260.md" @@ -22,9 +22,9 @@ public static Boolean valueOf(boolean b) {   静态工厂方法从重复调用中返回相同的对象的能力允许类在任何时候保持对实例的严格控制。这样做的类被认为是实例控制的。编写实例控制类的原因有几个。实例控制允许一个类保证它是一个单例(第 3 项)或非实例化的(第 4 项),并且它允许一个不可值的类(第 17 项)来保证没有两个相等的实例存在:当且仅当`a==b`成立时,`a.equals(b)`返回`true`,这是享元模式 \[Gamma95\] 的基础,枚举类型就提供了这种保证。 -  **静态工厂方法的第三个优点是,与构造函数不同,它们可以的对象可以是返回类型的任何子类的实例对象。** 这使在选择返回的对象的类时具有很大的灵活性。 +  **静态工厂方法的第三个优点是,与构造函数不同,它们返回的对象可以是返回类型的任何子类的实例对象。** 这使在选择返回的对象的类时具有很大的灵活性。 -  这种灵活性的一个应用是,API 可以返回对象,同时又不会使对象的类编程公有的,以这种方式隐藏实现类会使 API 变得非常简洁。这种技术适用于基于接口的框架(interface-based frameworks,见第 20 项),因为在这种框架中,接口为静态工厂方法提供了自然返回类型。 +  这种灵活性的一个应用是,API 可以返回对象,同时又不会使对象的类变成公有的,以这种方式隐藏实现类会使 API 变得非常简洁。这种技术适用于基于接口的框架(interface-based frameworks,见第 20 项),因为在这种框架中,接口为静态工厂方法提供了自然返回类型。   在 Java 8 之前,接口不能有静态方法。按照惯例,名为 Type 的接口的静态工厂方法被放置在一个不可实例化的名为 Types 的配套类(noninstantiable companion class)(第 4 项)中。例如,Java Collections Framework 有 45 个便利实现,分别提供了不可修改的集合、同步集合等等。几乎所有这些实现都通过静态工厂方法在一个不可实例化的类(java.util.Collections)中导出。所有返回对象的类都是非公有的。 diff --git "a/\347\254\25402\347\253\240\357\274\232\345\210\233\345\273\272\345\222\214\351\224\200\346\257\201\345\257\271\350\261\241/\347\254\2546\351\241\271\357\274\232\351\201\277\345\205\215\345\210\233\345\273\272\344\270\215\351\234\200\350\246\201\347\232\204\345\257\271\350\261\241.md" "b/\347\254\25402\347\253\240\357\274\232\345\210\233\345\273\272\345\222\214\351\224\200\346\257\201\345\257\271\350\261\241/\347\254\2546\351\241\271\357\274\232\351\201\277\345\205\215\345\210\233\345\273\272\344\270\215\351\234\200\350\246\201\347\232\204\345\257\271\350\261\241.md" index b488fc4..fabc5d8 100644 --- "a/\347\254\25402\347\253\240\357\274\232\345\210\233\345\273\272\345\222\214\351\224\200\346\257\201\345\257\271\350\261\241/\347\254\2546\351\241\271\357\274\232\351\201\277\345\205\215\345\210\233\345\273\272\344\270\215\351\234\200\350\246\201\347\232\204\345\257\271\350\261\241.md" +++ "b/\347\254\25402\347\253\240\357\274\232\345\210\233\345\273\272\345\222\214\351\224\200\346\257\201\345\257\271\350\261\241/\347\254\2546\351\241\271\357\274\232\351\201\277\345\205\215\345\210\233\345\273\272\344\270\215\351\234\200\350\246\201\347\232\204\345\257\271\350\261\241.md" @@ -1,6 +1,6 @@ ## 避免创建不需要的对象 -  一般来说,最好能重用对象而不是在每次需要的时候就创建一个相同功能的新对象。重用的方式既快速,有流行。如果对象是不可变(immutable)的(第 17 项),那么就能重复使用它。 +  一般来说,最好能重用对象而不是在每次需要的时候就创建一个相同功能的新对象。重用的方式既快速,又流行。如果对象是不可变(immutable)的(第 17 项),那么就能重复使用它。   作为一个极端的反面例子,考虑下面的语句: -- Gitee From d7926e02f8f4938ce36aee2721d738efa088da1a Mon Sep 17 00:00:00 2001 From: tilerlgt <5645442+tilerlgt@user.noreply.gitee.com> Date: Fri, 7 Feb 2020 15:38:55 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E4=B8=8D=E6=AD=A3=E7=A1=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...resources\344\274\230\345\205\210\344\272\216try-finally.md" | 2 +- ...\256\210\351\200\232\347\224\250\347\272\246\345\256\232.md" | 2 +- ...\351\207\215\345\206\231hashCode\346\226\271\346\263\225.md" | 2 +- ...\351\207\215\345\206\231toString\346\226\271\346\263\225.md" | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git "a/\347\254\25402\347\253\240\357\274\232\345\210\233\345\273\272\345\222\214\351\224\200\346\257\201\345\257\271\350\261\241/\347\254\2549\351\241\271\357\274\232try-with-resources\344\274\230\345\205\210\344\272\216try-finally.md" "b/\347\254\25402\347\253\240\357\274\232\345\210\233\345\273\272\345\222\214\351\224\200\346\257\201\345\257\271\350\261\241/\347\254\2549\351\241\271\357\274\232try-with-resources\344\274\230\345\205\210\344\272\216try-finally.md" index d4936d3..b9c47ce 100644 --- "a/\347\254\25402\347\253\240\357\274\232\345\210\233\345\273\272\345\222\214\351\224\200\346\257\201\345\257\271\350\261\241/\347\254\2549\351\241\271\357\274\232try-with-resources\344\274\230\345\205\210\344\272\216try-finally.md" +++ "b/\347\254\25402\347\253\240\357\274\232\345\210\233\345\273\272\345\222\214\351\224\200\346\257\201\345\257\271\350\261\241/\347\254\2549\351\241\271\357\274\232try-with-resources\344\274\230\345\205\210\344\272\216try-finally.md" @@ -88,4 +88,4 @@ static String firstLineOfFile(String path, String defaultVal) {   这里经验教训是很明确的(The lesson is clear):在处理必须关闭的资源时,相比于 try-finally,始终优先使用 try-with-resources。 生成的代码更短更清晰,它生成的异常更有用。 try-with-resources 语句可以在使用必须关闭的资源的同同时轻松编写正确的代码,使用 try-finally 几乎是不可能的。 > - [第 8 项:避免使用终结方法和清除方法](https://gitee.com/lin-mt/effective-java-third-edition/blob/master/第02章:创建和销毁对象/第8项:避免使用终结方法和清空方法.md) -> - [第 10 项:覆盖 equals 时请遵守通用约定](https://gitee.com/lin-mt/effective-java-third-edition/blob/master/第03章:对于所有对象都通用的方法/重写equals时请遵守通用约定.md) +> - [第 10 项:覆盖 equals 时请遵守通用约定](https://gitee.com/lin-mt/effective-java-third-edition/blob/master/第03章:对于所有对象都通用的方法/第10项:重写equals时请遵守通用约定.md) diff --git "a/\347\254\25403\347\253\240\357\274\232\345\257\271\344\272\216\346\211\200\346\234\211\345\257\271\350\261\241\351\203\275\351\200\232\347\224\250\347\232\204\346\226\271\346\263\225/\347\254\25410\351\241\271\357\274\232\351\207\215\345\206\231equals\346\227\266\350\257\267\351\201\265\345\256\210\351\200\232\347\224\250\347\272\246\345\256\232.md" "b/\347\254\25403\347\253\240\357\274\232\345\257\271\344\272\216\346\211\200\346\234\211\345\257\271\350\261\241\351\203\275\351\200\232\347\224\250\347\232\204\346\226\271\346\263\225/\347\254\25410\351\241\271\357\274\232\351\207\215\345\206\231equals\346\227\266\350\257\267\351\201\265\345\256\210\351\200\232\347\224\250\347\272\246\345\256\232.md" index 81040d7..af214b4 100644 --- "a/\347\254\25403\347\253\240\357\274\232\345\257\271\344\272\216\346\211\200\346\234\211\345\257\271\350\261\241\351\203\275\351\200\232\347\224\250\347\232\204\346\226\271\346\263\225/\347\254\25410\351\241\271\357\274\232\351\207\215\345\206\231equals\346\227\266\350\257\267\351\201\265\345\256\210\351\200\232\347\224\250\347\272\246\345\256\232.md" +++ "b/\347\254\25403\347\253\240\357\274\232\345\257\271\344\272\216\346\211\200\346\234\211\345\257\271\350\261\241\351\203\275\351\200\232\347\224\250\347\232\204\346\226\271\346\263\225/\347\254\25410\351\241\271\357\274\232\351\207\215\345\206\231equals\346\227\266\350\257\267\351\201\265\345\256\210\351\200\232\347\224\250\347\272\246\345\256\232.md" @@ -336,4 +336,4 @@ public boolean equals(MyClass o) {   总之,不要重写 equals 方法,除非您不得不这么做:在许多情况下,从 Object 继承的实现完全符合您的要求。 如果你确实重写了 equals,请确保比较所有类的关键字段,并使用之前提到的五个诀窍对它进行测试(If you do override equals, make sure to compare all of the class’s significant fields and to compare them in a manner that preserves all five provisions of the equals contract)。 > - [第 9 项:try-with-resources 优先于 try-finally](https://gitee.com/lin-mt/effective-java-third-edition/blob/master/第02章:创建和销毁对象/第9项:try-with-resources优先于try-finally.md) -> - [第 11 项:当重写 equals 方法时总要重写 hashCode 方法](https://gitee.com/lin-mt/effective-java-third-edition/blob/master/第03章:对于所有对象都通用的方法/第11项:当重写equals方法时总要重写hashCode方法.md) +> - [第 11 项:当重写 equals 方法时总要重写 hashCode 方法](https://gitee.com/lin-mt/effective-java-third-edition/blob/master/第03章:对于所有对象都通用的方法/第11项:当重写equals方法是始终重写hashCode方法.md) diff --git "a/\347\254\25403\347\253\240\357\274\232\345\257\271\344\272\216\346\211\200\346\234\211\345\257\271\350\261\241\351\203\275\351\200\232\347\224\250\347\232\204\346\226\271\346\263\225/\347\254\25411\351\241\271\357\274\232\345\275\223\351\207\215\345\206\231equals\346\226\271\346\263\225\346\230\257\345\247\213\347\273\210\351\207\215\345\206\231hashCode\346\226\271\346\263\225.md" "b/\347\254\25403\347\253\240\357\274\232\345\257\271\344\272\216\346\211\200\346\234\211\345\257\271\350\261\241\351\203\275\351\200\232\347\224\250\347\232\204\346\226\271\346\263\225/\347\254\25411\351\241\271\357\274\232\345\275\223\351\207\215\345\206\231equals\346\226\271\346\263\225\346\230\257\345\247\213\347\273\210\351\207\215\345\206\231hashCode\346\226\271\346\263\225.md" index fe892ea..86328bf 100644 --- "a/\347\254\25403\347\253\240\357\274\232\345\257\271\344\272\216\346\211\200\346\234\211\345\257\271\350\261\241\351\203\275\351\200\232\347\224\250\347\232\204\346\226\271\346\263\225/\347\254\25411\351\241\271\357\274\232\345\275\223\351\207\215\345\206\231equals\346\226\271\346\263\225\346\230\257\345\247\213\347\273\210\351\207\215\345\206\231hashCode\346\226\271\346\263\225.md" +++ "b/\347\254\25403\347\253\240\357\274\232\345\257\271\344\272\216\346\211\200\346\234\211\345\257\271\350\261\241\351\203\275\351\200\232\347\224\250\347\232\204\346\226\271\346\263\225/\347\254\25411\351\241\271\357\274\232\345\275\223\351\207\215\345\206\231equals\346\226\271\346\263\225\346\230\257\345\247\213\347\273\210\351\207\215\345\206\231hashCode\346\226\271\346\263\225.md" @@ -106,5 +106,5 @@ private int hashCode; // Automatically initialized to 0   总之,每次覆盖 equals 时都必须覆盖 hashCode,否则程序将无法正常运行。 您的 hashCode 方法必须遵守 Object 中指定的规定,并且必须合理地将不相等的哈希代码分配给不相等的实例。如果觉得有点单调乏味,就使用第 51 页【原书本】的方式,这很容易实现。如第 10 项所述,AutoValue 框架提供了手动编写 equals 和 hashCode 方法的详细替代方案,IDE 也提供了一些此功能。 -> - [第 10 项:覆盖 equals 时请遵守通用约定](https://gitee.com/lin-mt/effective-java-third-edition/blob/master/第03章:对于所有对象都通用的方法/重写equals时请遵守通用约定.md) +> - [第 10 项:覆盖 equals 时请遵守通用约定](https://gitee.com/lin-mt/effective-java-third-edition/blob/master/第03章:对于所有对象都通用的方法/第10项:重写equals时请遵守通用约定.md) > - [第 12 项:始终重写 toString 方法](https://gitee.com/lin-mt/effective-java-third-edition/blob/master/第03章:对于所有对象都通用的方法/第12项:始终重写toString方法.md) diff --git "a/\347\254\25403\347\253\240\357\274\232\345\257\271\344\272\216\346\211\200\346\234\211\345\257\271\350\261\241\351\203\275\351\200\232\347\224\250\347\232\204\346\226\271\346\263\225/\347\254\25412\351\241\271\357\274\232\345\247\213\347\273\210\351\207\215\345\206\231toString\346\226\271\346\263\225.md" "b/\347\254\25403\347\253\240\357\274\232\345\257\271\344\272\216\346\211\200\346\234\211\345\257\271\350\261\241\351\203\275\351\200\232\347\224\250\347\232\204\346\226\271\346\263\225/\347\254\25412\351\241\271\357\274\232\345\247\213\347\273\210\351\207\215\345\206\231toString\346\226\271\346\263\225.md" index ad5b786..5e76ac4 100644 --- "a/\347\254\25403\347\253\240\357\274\232\345\257\271\344\272\216\346\211\200\346\234\211\345\257\271\350\261\241\351\203\275\351\200\232\347\224\250\347\232\204\346\226\271\346\263\225/\347\254\25412\351\241\271\357\274\232\345\247\213\347\273\210\351\207\215\345\206\231toString\346\226\271\346\263\225.md" +++ "b/\347\254\25403\347\253\240\357\274\232\345\257\271\344\272\216\346\211\200\346\234\211\345\257\271\350\261\241\351\203\275\351\200\232\347\224\250\347\232\204\346\226\271\346\263\225/\347\254\25412\351\241\271\357\274\232\345\247\213\347\273\210\351\207\215\345\206\231toString\346\226\271\346\263\225.md" @@ -65,5 +65,5 @@ Assertion failure: expected {abc, 123}, but was {abc, 123}.   回顾一下,在你编写的每个可实例化的类中重写 Object 的 toString 实现,除非超类已经这样做了。 它使类的使用更加愉快,并有助于调试。toString 方法应该以美学上令人愉悦的格式返回对象的简明有用的描述(The toString method should return a concise, useful description of the object, in an aesthetically pleasing format)。 -> - [第 11 项:当重写 equals 方法时总要重写 hashCode 方法](https://gitee.com/lin-mt/effective-java-third-edition/blob/master/第03章:对于所有对象都通用的方法/第11项:当重写equals方法时总要重写hashCode方法.md) +> - [第 11 项:当重写 equals 方法时总要重写 hashCode 方法](https://gitee.com/lin-mt/effective-java-third-edition/blob/master/第03章:对于所有对象都通用的方法/第11项:当重写equals方法是始终重写hashCode方法.md) > - [第 13 项:谨慎地重写 clone 方法](https://gitee.com/lin-mt/effective-java-third-edition/blob/master/第03章:对于所有对象都通用的方法/第13项:谨慎地重写clone方法.md) -- Gitee