Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Java接口保证数据结构?_Java_Variables_Data Structures_Interface - Fatal编程技术网

如何通过Java接口保证数据结构?

如何通过Java接口保证数据结构?,java,variables,data-structures,interface,Java,Variables,Data Structures,Interface,假设我有一个接口“Car”和该接口的一个具体实现“Campervan”。我希望每辆车都有以下变量: 内部座位 国际旅客 有人可能会认为界面可能是这样的: interface Car{ private Integer passengers; public Integer seats; } 但这不起作用有几个原因。Java接口不允许FINAL和PUBLIC以外的变量 既然Java接口不允许使用公共最终变量以外的变量,那么我如何实现实现该接口的所有类(如Campervan)都具有包含这些变量

假设我有一个接口“Car”和该接口的一个具体实现“Campervan”。我希望每辆车都有以下变量: 内部座位 国际旅客

有人可能会认为界面可能是这样的:

interface Car{
  private Integer passengers;
  public Integer seats;
}
但这不起作用有几个原因。Java接口不允许FINAL和PUBLIC以外的变量

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


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

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

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

解决方案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);
}
interface Car{
   public Integer getPassengers();
   public Integer getSeats();
}

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

解决方案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);
}
interface Car{
   public Integer getPassengers();
   public Integer getSeats();
}

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

接口的主要目的是将抽象与实现分离。通过要求实现接口的类遵循某种实现,您就是在挑战接口的概念。您可以定义接口,这样您就不必关心它是如何实现的,只要实现它的类执行它们承诺的操作(您不必担心它们是如何实现的)

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

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

    void setPassengers(Integer value);
    void setSeats(Integer value);
}
interface Car{
   public Integer getPassengers();
   public Integer getSeats();
}

使用
Car
接口,您可以随时调用
getPassentials()
方法,而无需关心类(接口的实现者)是如何获得乘客数量的。

接口的主要目的是将抽象与实现分离开来。通过要求实现接口的类遵循某种实现,您就是在挑战接口的概念。您可以定义接口,这样您就不必关心它是如何实现的,只要实现它的类执行它们承诺的操作(您不必担心它们是如何实现的)

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

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

    void setPassengers(Integer value);
    void setSeats(Integer value);
}
interface Car{
   public Integer getPassengers();
   public Integer getSeats();
}

有了
Car
接口,您可以随时调用
getPassentials()
方法,而不必关心类(接口的实现者)正在做什么来获取乘客数量。

我如何实现所有实现接口的类(如Campervan)的承诺通过不使用接口,具有包含这些变量的内部数据结构?
。使用常规类或抽象类并对其进行扩展。每个子类都有您在超类中定义的结构。我认为契约比承诺更好(承诺与异步编程广泛相关)。
如何实现所有实现接口的类(如Campervan)的承诺通过不使用接口,具有包含这些变量的内部数据结构?
。使用常规类或抽象类并对其进行扩展。每个子类都有您在超类中定义的结构。我认为契约比承诺更好(承诺与异步编程广泛相关)。