java - 在不实例化(未知)具体类型的情况下从方法返回接口(interface)对象

标签 java design-patterns interface polymorphism

我确信对此有一些解决方案或模式,但我在阐明问题以找到正确答案时遇到了问题。

我有一个接口(interface),ICar:

public interface ICar {
void SetMake(String make);
String GetMake();
}

我有课,车:

public class Car implements ICar {
private String make;

public void SetMake(String make) { this.make = make; }

public String GetMake() { return make; }

我在另一个类中有一个方法,它不知道 Car。本着多态性的精神,我希望此方法返回一个 ICar,以便有人可以创建自己的 ICar 实现并将该方法用于他们的汽车:

...//class preamble
public ICar myMethod() {
    ICar myCar = new ICar();
    myCar.SetMake("Ferrari");
    return myCar;
}

我不确定为什么这样的东西行不通。由于 ICar 包含方法 SetMake,因此每个实现也必须包含此方法。 jvm 肯定可以通过某种方式将方法调用排队,然后在方法的具体化可用时运行它们吗?

另一个想法是将新创建的 ICar 实现作为参数传递给 myMethod 并调用它的方法,但我觉得这可能不是一个干净的实现,因为我每次都需要创建一个 Car 实例.此外,如果没有无参数构造函数,我将不得不使用虚拟数据(也不是干净的)对其进行实例化。

我觉得我对如何实现这样的东西缺乏了解,想知道是否有人可以提供帮助?

谢谢。

最佳答案

一种方法是提供类类型作为参数,并使其通用:

public <T extends ICar> T myMethod(Class<T> type) {
    try {
        T myCar = type.newInstance(); // T needs a visible no-args constructor
        myCar.SetMake("Ferrari");
        return myCar;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

(另请注意,我通过将任何异常包装在 RuntimeException 中来处理异常)

然后你需要这样调用它:

Car car = myMethod(Car.class);

一种更灵活的方法是引入工厂接口(interface)并将工厂实例传递给myMethod,后者使用它来创建具体的ICar。工厂仍然可以是通用的:

public interface ICarFactory<T extends ICar> {
    T createCar();
}

...

public <T extends ICar> T myMethod(ICarFactory<T> factory) {
    T myCar = factory.createCar();
    myCar.SetMake("Ferrari");
    return myCar;
}

...

Car car = myMethod(carFactory);

关于java - 在不实例化(未知)具体类型的情况下从方法返回接口(interface)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36316969/

相关文章:

parsing - 解析文本的设计模式

Java - 从接口(interface)类型而不是类声明

java - Java中如何用特定数字填充空数组?

c# - 不使用反射无法降低工厂方法中的圈复杂度

language-agnostic - 什么时候使用调解器设计模式

interface - 静态上下文错误中使用的非静态方法

cocoa - iPhoto 风格的侧边栏

java - 如何使用多线程使慢速 "for loop"更快?

java - JDK 包含哪些脚本语言解释器?

java - XML 的注解 @JsonDeserialize 的等价物