1

一个来自有效java的代码,这里我们使用aList来遵守通过接口引用对象的良好实践。

// Good - uses interface as type
List<Subscriber> subscribers = new Vector<Subscriber>();

假设我们有一个car接口并且2wheel4wheel具体的子类。是否甚至建议(似乎相当肯定)构造一个“汽车”类型的列表?

List<Car> car = new Vector<2wheel>();

代替

List<2wheel> car = new Vector<2wheel>();
4

2 回答 2

3

我同意这本书。尽可能使用接口类型。我在 中使用2wheelor4wheel实现的唯一方法List是它们是否包含需要调用但不在接口上的特定方法。

例如:

public interface Car{
   public void drive();
}

public class 2wheel implements Car{
   public void drive(){
      //implementation
   }
}


public class 4wheel implements Car{
   public void drive(){
      //implementation
   }

   public void initiate4WheelDrive(){
      //implementation
   }
}

如果你有一个List和代码使用列表需要调用的initiate4WheelDrive方法,那么你必须使用具体的实现。这通常由调用代码决定,但如果可能的话,请坚持使用接口,以便您可以轻松地交换实现。

另请注意,该2wheel名称在 Java 中将是无效名称,因为类和接口名称不能以数字开头。

于 2013-08-13T23:20:18.150 回答
0

一个接口指定了一个类型,并且许多类可以通过共享相同的类型来共享相似(或相同)的行为。

在接口表示实现类的主要功能、目的或行为的情况下,使用接口名称来引用类型的实例确实很有意义。集合类和 JDBC RowSet 类就是很好的例子。CachedRowSet 实例的一个强定义特征是它是一个 RowSet,由 RowSet 接口的协定定义。

但是有一些类,它们实现的接口提供了附属功能或行为。在这些情况下,接口的契约不是类的存在理由......在这里我不同意布洛赫先生的格言,即每个接口都应该成为您引用所有实例的类型。

为了更具体一点,实现 Comparable 的类实例化为 Comparable 有多少次?还是克隆人?当然,有时将这些“次要接口”用作某些方法参数的类型确实有意义……但这与“始终将对象称为接口定义的类型的实例”不同。

TL;DR:接口应该始终用作对象类型的规则是一个很好的规则,主要是当接口具有明确的契约并且契约定义了实现类的主要功能、行为或目的时。

于 2013-08-14T00:01:34.873 回答