Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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_Generics_Interface_Enums - Fatal编程技术网

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

实例化/从枚举返回时的类型安全接口(Java),java,generics,interface,enums,Java,Generics,Interface,Enums,假设我们有一个汽车对象: public interface Automobile { } 我们还有两款不同的汽车(is-a),一款配备自动变速器,另一款配备手动变速器: public class FordExplorer implements Autmomobile { public static void shiftIntoPark() { } } public class Porsche911 implements Autmomobile { public sta

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

public interface Automobile {
}
我们还有两款不同的汽车(is-a),一款配备自动变速器,另一款配备手动变速器:

public class FordExplorer implements Autmomobile {
    public static void shiftIntoPark() {
    }
}

public class Porsche911 implements Autmomobile {
    public static void shiftInto1stGear() {
    }
}
现在,让我们假设我们有一个enum车库,它存储这些汽车:

public enum Garage {
    FORD {
        public Automobile getCar() {
            return new FordExplorer();
        }
    }, PORSCHE {
        public Automobile getCar() {
            return new Porsche911();
        }
    };

    abstract public Automobile getCar();
    }

}

此实现(或类似实现)是否有类型安全的“最佳实践”(即,福特的getCar()方法的返回类型仅包括shiftIntoPark()方法,同样,保时捷的同一方法的返回类型仅包括shiftInto1stGear()方法)?

Garage.getCar返回的类型是Automobile,它不会公开这些停车方法中的任何一种。由于shift方法是静态的,您不会从中获得多态行为,因此必须对特定类调用它们

很可能您期望使用汽车的东西在如何使用汽车方面过于聪明,从而破坏了使用界面的目的。使用这样的接口或超类的意义在于,程序可以在高层操作对象,而不必关心实现细节,让不同的对象实现自行处理。一个类似的玩具示例可能是一辆汽车,它公开了一个park方法,其中park方法由特定子类根据其特定需求以不同的方式实现

(或者干脆放弃界面,因为驾驶野马与驾驶花冠完全不同,所以他们共享界面可能没有意义。)


接口和超类有助于提供高级接口并隐藏实现细节,因此它们可以在本地包含,而不会泄漏到程序的其余部分。计算出您希望对象如何使用,它定义了您希望公开的接口,以及您希望对象自行处理的内容。

一种方法是保留
汽车
,但不是将其用作标记接口,而是声明所有“shift”方法。然后,特定的类要么实现它们,要么抛出一个
UnsupportedOperationException
。如果我理解正确,则为否。如果该方法必须能够返回两辆车,则必须返回一个与这两辆车都匹配的类型。因此,在该类型中声明的任何方法都必须由它们两个实现。@Mena-我认为抛出
UnsupportedOperationException
不是最佳实践,因为它违反了Liskov替换原则:@AdamMichalik我同意,但没有说这是最佳实践。我会反过来看。野马和花冠在驾驶方面有所不同,但由于这个问题的中心是车库(在存储的意义上),因此没有实际的区别,唯一可能影响存储的是尺寸限制。然而,只要op试图从中获得真正的存储空间,而不是无限的新车来源,
enum
就变得不合适了…