From 69043c55bca1ff32feb56c804e1877439a38bc70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=89=E5=8B=87=E5=BC=BA2?= Date: Thu, 14 Nov 2019 20:15:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BB=85=E7=94=A8=E6=9D=A5?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ch04类和接口/22.接口仅用来定义类型.md | 19 +++++++++++++++++++ .../java/com/jueee/item22/Item22Example01.java | 14 ++++++++++++++ .../java/com/jueee/item22/Item22Example02.java | 10 ++++++++++ 3 files changed, 43 insertions(+) create mode 100644 ch04类和接口/22.接口仅用来定义类型.md create mode 100644 ch04类和接口/ClassesAndInterfaces/src/main/java/com/jueee/item22/Item22Example01.java create mode 100644 ch04类和接口/ClassesAndInterfaces/src/main/java/com/jueee/item22/Item22Example02.java diff --git a/ch04类和接口/22.接口仅用来定义类型.md b/ch04类和接口/22.接口仅用来定义类型.md new file mode 100644 index 0000000..832ab8b --- /dev/null +++ b/ch04类和接口/22.接口仅用来定义类型.md @@ -0,0 +1,19 @@ +## 接口仅用来定义类型 + +一种失败的接口就是所谓的常量接口(constant interface)。 + +这样的接口不包含任何方法; 它只包含静态 final 属性,每个输出一个常量。 + +使用这些常量的类实现接口,以避免需要用类名限定常量名。 + +**示例代码**:[Item22Example01.java](ClassesAndInterfaces/src/main/java/com/jueee/item22/Item22Example01.java):常量接口类 - **禁止这样使用!** + +**常量接口模式是对接口的糟糕使用。** 类在内部使用一些常量,完全属于实现细节。实现一个常量接口会导致这个实现细节泄漏到类的导出 API 中。对类的用户来说,类实现一个常量接口是没有意义的。事实上,它甚至可能使他们感到困惑。更糟糕的是,它代表了一个承诺:如果在将来的版本中修改了类,不再需要使用常量,那么它仍然必须实现接口,以确保二进制兼容性。如果一个非 final 类实现了常量接口,那么它的所有子类的命名空间都会被接口中的常量所污染。 + +Java 平台类库中有多个常量接口,如 `java.io.ObjectStreamConstants。` 这些接口应该被视为不规范的,不应该被效仿。 + +如果你想导出常量,有几个合理的选择方案。 如果常量与现有的类或接口紧密相关,则应将其添加到该类或接口中。 + +**示例代码**:[Item22Example02.java](ClassesAndInterfaces/src/main/java/com/jueee/item22/Item22Example02.java):Item22Example01.java 示例的工具类的版本。 + +总之,接口只能用于定义类型。 它们不应该仅用于导出常量。 \ No newline at end of file diff --git a/ch04类和接口/ClassesAndInterfaces/src/main/java/com/jueee/item22/Item22Example01.java b/ch04类和接口/ClassesAndInterfaces/src/main/java/com/jueee/item22/Item22Example01.java new file mode 100644 index 0000000..2b6a4a9 --- /dev/null +++ b/ch04类和接口/ClassesAndInterfaces/src/main/java/com/jueee/item22/Item22Example01.java @@ -0,0 +1,14 @@ +package com.jueee.item22; + +// 常量接口类 - 禁止这样使用! +public interface Item22Example01 { + + // Avogadro's number (1/mol) + static final double AVOGADROS_NUMBER = 6.022_140_857e23; + + // Boltzmann constant (J/K) + static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; + + // Mass of the electron (kg) + static final double ELECTRON_MASS = 9.109_383_56e-31; +} diff --git a/ch04类和接口/ClassesAndInterfaces/src/main/java/com/jueee/item22/Item22Example02.java b/ch04类和接口/ClassesAndInterfaces/src/main/java/com/jueee/item22/Item22Example02.java new file mode 100644 index 0000000..cef746f --- /dev/null +++ b/ch04类和接口/ClassesAndInterfaces/src/main/java/com/jueee/item22/Item22Example02.java @@ -0,0 +1,10 @@ +package com.jueee.item22; + +public class Item22Example02 { + + private Item22Example02() { } // 防止实例化 + + public static final double AVOGADROS_NUMBER = 6.022_140_857e23; + public static final double BOLTZMANN_CONST = 1.380_648_52e-23; + public static final double ELECTRON_MASS = 9.109_383_56e-31; +}