如何通过Java接口承诺数据结构?

时间:2017-04-05 09:43:43

标签: java variables data-structures interface

让我们说我有一个接口“Car”和该接口的具体实现称为“Campervan”。我希望每辆车都有以下变量:  int座位  int乘客

有人可能会认为界面看起来像这样:

interface Car{
  private Integer passengers;
  public Integer seats;
}

但由于几个原因,这不起作用。 Java接口不允许使用FINAL和PUBLIC以外的变量。

由于Java接口不允许公共最终变量以外的变量,我如何实现承诺所有实现接口的类(如Campervan)都具有包含这些变量的内部数据结构?公共最终变量并不总是我希望我的接口承诺。

注意:我确实理解接口的概念不包括内部状态,因此强制变量是最终的。但这是否意味着Java接口不允许承诺内部数据结构?

3 个答案:

答案 0 :(得分:3)

该接口旨在供程序的其他部分使用,而内部数据结构则用于实现接口来决定。如果要在类层次结构中重用某些内部数据结构,则应使用抽象类。

答案 1 :(得分:2)

接口的主要目的是将抽象与实现分开。通过要求实现接口的类遵循某种实现,您无视接口的概念。你定义了接口,所以你不关心它是如何实现的,只要实现它的类做他们承诺做的事情(你不应该担心他们是如何做的)。

在您的示例中,您可以使用此界面:

interface Car{
   public Integer getPassengers();
   public Integer getSeats();
}

拥有Car界面,您可以随时调用getPassengers()方法,而无需关心类(接口的实现者)正在做什么来获得乘客数量。

答案 2 :(得分:1)

解决方案1 ​​ - 改为使用抽象类:

public abstract class Car{
    private Integer passengers;
    private Integer seats;

    // setters and getters...
}

如果您的实现类已经扩展了其他类,那么这当然不会起作用:

解决方案2 - 将getter和setter添加到界面:

interface Car{
    Integer getPassengers();
    Integer getSeats();

    void setPassengers(Integer value);
    void setSeats(Integer value);
}

此外,您无法在界面中将某些内容标记为private。这没有任何意义。接口的目的是使客户端代码能够访问成员,而无需知道它使用的是什么对象和实现。因此,私有成员在接口中非常无用,因为客户端代码无法以任何方式访问它。