接口仅用来定义类型

当类实现接口时,该接口作为一种类型(type),可以用来引用类的实例。因此,一个类实现了一个接口,因此表明客户端可以如何处理类的实例。为其他目的定义接口是不合适的。

一种失败的接口就是所谓的常量接口(constant interface)。 这样的接口不包含任何方法; 它只包含静态 final 属性,每个输出一个常量。 使用这些常量的类实现接口,以避免需要用类名限定常量名。 这里是一个例子:

public interface PhysicalConstants {

    static final double AVOGADROS_NUMBER   = 6.022_140_857e23;

}

  常量接口模式是对接口的糟糕使用。 类在内部使用一些常量,完全属于实现细节。实现一个常量接口会导致这个实现细节泄漏到类的导出 API 中。对类的用户来说,类实现一个常量接口是没有意义的。事实上,它甚至可能使他们感到困惑。更糟糕的是,它代表了一个承诺:如果在将来的版本中修改了类,不再需要使用常量,那么它仍然必须实现接口,以确保二进制兼容性。如果一个非 final 类实现了常量接口,那么它的所有子类的命名空间都会被接口中的常量所污染

原文地址:https://www.cnblogs.com/lIllIll/p/12702795.html

时间: 04-15

接口仅用来定义类型的相关文章

第十九条:接口只用于定义类型

当类实现接口时,接口就充当可以引用这个类的实例的类型.因此,类实现了接口,就表明客户端可以对这个类的实例实施接口中的方法. 为了任何其他目的而定义接口是不恰当的. 常量接口:接口中只有常量,定义这个接口,目的是为了让实现这个接口的类,使用定义的常量. 常量接口这种做法应该不被使用.同样的目的,我们可以专门定义个存放常量的工具类来完成. JDK中几个常量接口:ObjectStreamConstants接口 接口应该只被用来定义类型 ,它们不应该被用来导出常量.

第19条:接口只用于定义类型

当类实现接口时,接口就充可以引用这个类的实例的类型.因此,类实现了接口,就表明客户端可以对这个类的实例实施某些动作.为了任何其他目的而定义接口是不恰当的. 有一种接口被称为常量接口(constant interface),它不满足上面的条件.这种接口没有包含任何方法,它只包含静态的final域,每个域都导出一个常量.使用这些常量的类实现这个接口,以避免用类名来修饰常量名.下面是一个例子: 1 public interface PhysicalConstants { 2 static final

利用接口实现多种数据库类型的灵活更换

当存在可能要更换数据库类型的时候,要考虑两个问题: 一,不同类型的数据库命名空间不一样,用到的函数名也不一样,尽管很相似: 二,有些SQL语句在不一样的数据库之间是不通用的! 那么要在更换数据库类型的时候,如何做到尽量少受因为上面两点而造成的影响呢?!利用接口,可以将第一点的影响降到最低!至于第二点, 可以将数据的操作尽量在数据库服务器端实现,这点的探讨不在本文研究范围内,在此也就不多说!下面主要就利用接口将第一点的影响降到最低这一点进行详细说 明. 首先,明确两点: 1, 无论哪种数据库类型,

C# 通过IEnumberable接口和IEnumerator接口实现自定义集合类型foreach功能

1.IEnumerator和IEnumerable的作用 其实IEnumerator和IEnumerable的作用很简单,就是让除数组和集合之外的类型也能支持foreach循环,至于foreach循环,如果不清楚,请参考C# foreach循环较for循环的优势与劣势 代码如下: static void Main(string[] args) { CatList cats = new CatList(); foreach (var cat in cats) { Console.WriteLine

IntelliSense 无法重载仅按返回类型区分的函数

IntelliSense:无法重载仅按返回类型区分的函数       d:\programfiles (x86)\microsoft sdks\windows\v7.0a\include\winbase.h         3540 在VS2010下用C语言写Windows系统服务,从另一个c#的项目中Copy过来一段代码,修改后再编译,就产生了这个错误! 在网上搜索得到的答案是:"无法重载仅按返回类型区分的函数"这种情况一般只会发生在有同名函数的情况下,但是我那段代码里却没有同名函数

抽象类和接口作为返回值类型的问题

1 /* 2 返回值类型 3 引用类型: 4 类:返回的是该类的对象 5 抽象类:返回的是该抽象类的子类对象 6 接口: 7 */ 8 abstract class Person { 9 public abstract void study(); 10 } 11 12 class PersonDemo { 13 public Person getPerson() { 14 //Person p = new Student(); 15 //return p; 16 17 return new St

Java定义接口变量为接收类型有什么好处(面向接口编程)

个人理解:定义接口变量为接收类型属于面向接口的编程,通过接口的抽象能减少类之间的耦合,增加可复用性. 面向接口编程: 一种规范约束 制定者(或者叫协调者),实现者(或者叫生产者),调用者(或者叫消费者). 接口本质上就是由制定者来协调实现者和调用者之间的关系. 只有实现者和调用者都遵循“面向接口编程”这个准则,制定者的协调目的才能达到. 接口的语义是can-do语义,表约束(Constraint). 像JDBC的规范API,不管你使用哪一套实现,我们使用的时候都是使用相同的API. 分离设计与实

Google地图接口API之地图类型(六)

1. Google 地图- 基本地图类型 Google Maps API 中提供了以下地图类型: MapTypeId.ROADMAP,用于显示默认的道路地图视图 MapTypeId.SATELLITE,用于显示 Google 地球卫星图片 MapTypeId.HYBRID,用于同时显示普通视图和卫星视图 MapTypeId.TERRAIN,用于根据地形信息显示实际地图. 要通过 Map 修改正在使用的地图类型,可以为其设置 mapTypeId 属性,如下所示: var mapProp = { c

接口——定义,实现接口的条件,类型与接口的关系,类型断言

1.定义 Go 语言的接口设计是非侵入式的,接口编写者无须知道接口被哪些类型实现.而接口实现者只需知道实现的是什么样子的接口,但无须指明实现哪一个接口.编译器知道最终编译时使用哪个类型实现哪个接口,或者接口应该由谁来实现. 每个接口类型由数个方法组成.接口的形式代码如下: type 接口类型名 interface{ 方法名1( 参数列表1 ) 返回值列表1 方法名2( 参数列表2 ) 返回值列表2 …} 说明: 接口类型名:使用 type 将接口定义为自定义的类型名.Go语言的接口在命名时,一般