假设我们有一个汽车对象:
public interface Automobile {
}
我们还有几辆不同的汽车(is-a),一辆配备自动变速箱,另一辆配备手动变速箱:
public class FordExplorer implements Autmomobile {
public static void shiftIntoPark() {
}
}
public class Porsche911 implements Autmomobile {
public static void shiftInto1stGear() {
}
}
现在,假设我们有一个枚举 Garage,用于存储这些汽车:
public enum Garage {
FORD {
public Automobile getCar() {
return new FordExplorer();
}
}, PORSCHE {
public Automobile getCar() {
return new Porsche911();
}
};
abstract public Automobile getCar();
}
}
此实现(或类似的实现)是否有一种类型安全的“最佳实践”(即,FORD 的 getCar() 方法的返回类型仅包括 shiftIntoPark() 方法,并且,同样,PORSCHE 的同一方法的返回类型仅包括 shiftInto1stGear() 方法)?
最佳答案
Garage.getCar 返回的类型是 Automobile,它不会公开任何这些 parking 方法。由于移位方法是静态的,因此您无法从中获得多态行为,因此必须在特定的类上调用它们。
您可能期望使用汽车的东西对于它如何使用汽车过于聪明,从而违背了使用界面的目的。使用这样的接口(interface)或父类(super class)的目的是使程序可以在较高级别上操作对象,而无需关心实现细节,让不同的对象实现自行处理。类似的玩具示例可能是暴露了 parking 方法的汽车,其中特定子类根据其特定需求以不同方式实现该 parking 方法。
(或者完全摆脱界面,因为驾驶野马与驾驶卡罗拉完全不同,因此它们共享界面可能没有意义。)
接口(interface)和父类(super class)有助于提供高级接口(interface)并隐藏实现细节,以便它们可以包含在本地并且不会泄漏到程序的其余部分。弄清楚您希望如何使用该对象,它定义了您想要公开的接口(interface),以及您希望该对象自己处理什么。
关于java - 实例化/从枚举返回时类型安全的接口(interface) (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33612720/