写点什么

Java 程序经验小结:接口只用于定义类型

发布于: 2021 年 01 月 16 日
Java 程序经验小结:接口只用于定义类型

1、写在开头

当类实现接口时,接口就可以充当引用这个类的实例的类型(type)。因此,类实现了接口,就表明客户端可以对这个类的实例实施某些动作。除此之外,为了任何其他目的而定义接口都是使用不恰当的。

2、接口使用误区:常量接口

常量接口模式是对接口的不良使用。

  1. 类实现常量接口,对于类的使用者没有任何价值。

  2. 后续发行版本中,如果类被修改而不需要这些常量了,但是该类必须实现这个接口,因为要确保二进制兼容性。

  3. 如果该类是 final 类,它的所有子类的命名空间都会被接口的常量所“污染”。



public interface PhysicalConstantsInterface { static final double AVOGADROS_NUMBER = 6.02214199e23;
static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
static final double ELECTRON_MASS = 9.10938188e-31;}
复制代码


Java 库其实也有反面教材,例如 java.io.ObjectStreamConstants,我们不应该效仿:


/** * Constants written into the Object Serialization Stream. * * @author  unascribed * @since JDK 1.1 */public interface ObjectStreamConstants {
/** * Magic number that is written to the stream header. */ final static short STREAM_MAGIC = (short)0xaced;
/** * Version number that is written to the stream header. */ final static short STREAM_VERSION = 5;
/* Each item in the stream is preceded by a tag */
/** * First tag value. */ final static byte TC_BASE = 0x70;}
复制代码


3、常量接口的优化方案

对于如何合理导出常量,有 3 种合理方案:


  • 第一、如果常量和现有类紧密相关,应该将这些常量添加到这个类中。例如:Integer 和 Double 类。


public final class Integer extends Number implements Comparable<Integer> {    /**     * A constant holding the minimum value an {@code int} can     * have, -2<sup>31</sup>.     */    @Native public static final int   MIN_VALUE = 0x80000000;
/** * A constant holding the maximum value an {@code int} can * have, 2<sup>31</sup>-1. */ @Native public static final int MAX_VALUE = 0x7fffffff;}
复制代码


  • 第二、如果常量被看作枚举类型的成员,那就应该使用枚举类型来导出这些常量。


  • 第三、最后一种是使用不可实例化的工具类(utility class)来导出这些常量。


public class PhysicalConstants {  static final double AVOGADROS_NUMBER = 6.02214199e23;
static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
static final double ELECTRON_MASS = 9.10938188e-31;}
复制代码


在 jdk1.5 之后,引入静态导入机制,我们可以避免使用类名来修饰常量名。


import static effectivejava.no19.PhysicalConstants.AVOGADROS_NUMBER;public class Test {  double atoms(double mols){    return AVOGADROS_NUMBER * mols;  }}
复制代码

4、总结

简而言之,接口应该只用来定义类型,不应该被用来导出常量。

发布于: 2021 年 01 月 16 日阅读数: 13
用户头像

Diligence is the mother of success. 2018.03.28 加入

公众号:后台技术汇 笔者主要从事Java后台开发,喜欢技术交流与分享,保持饥渴,一起进步!

评论

发布
暂无评论
Java 程序经验小结:接口只用于定义类型