java - 实例化/从枚举返回时类型安全的接口(interface) (Java)

标签 java generics interface enums

假设我们有一个汽车对象:

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/

相关文章:

Java 负数乘法

Java 泛型不允许我向列表中添加另一个项目

java - 是否可以使用 hibernate 注释持久化 List<E> ,其中 E 是一个接口(interface)?

java - 在Android中拦截WebView请求的最佳方法

java - JackRabbit 在 WAS 上为我们的一个 REST 应用程序设置

java - java中的动态方法返回类型

c# - 我把所有这些接口(interface)放在哪里?

java - 具有 future 兼容性且不会破坏 future 修改的类

java - 使用 Spring Config 创建泛型类型

c# - 查找并调用通用重载方法