java - 当类型的实现不再有效时该怎么办?

标签 java oop implementation abstraction

现状..

我有一个Car接口(interface):

interface Car {
    void startWith(Key key);
    void switchGearTo(GearMode mode);
    //..

    static Car newCar() { // factory
        return new CarImpl();
    }
}

(工厂存在于单独的类中,嵌套以缩短此示例)

该接口(interface)有一个实现:

class CarImpl implements Car {
    private Ignition ignition;
    private GearShift gearShift;

    public void startWith(Key key) {
        // use ignition
    }

    public void switchGearTo(GearMode mode) {
        // use gear shift
    }
}

此时,Car 已经足以满足应用程序的需求,因此这种结构很好。它是基于 YAGNI 原则创建的,因为不需要进一步的抽象并且满足了我们的要求。

问题..

应用程序的要求已发生变化,Car 不再足够具体。我们需要不同类型的汽车,例如SportsCar;需要另一个抽象级别。

问题是,Car 已经有一个直接的实现,而它现在应该只是一个没有实现的抽象级别。

我无法删除静态工厂,否则会破坏代码。但开发人员应该不再能够创建 Car 实例,因为它不再足以满足我的应用程序的需求。

我尝试的解决方案..

解决此类问题的唯一方法似乎是进行重大重新部署。应用程序的理念已经改变,这意味着需要“重新开始”,并且没有其他方法可以解决这个问题。 (我真的希望情况并非如此)

我可以指定一辆默认汽车,但我仍然需要为默认汽车创建一个新的(描述性)方法,从而导致同一类中的 2 个方法执行完全相同的操作(无需更改即可伸缩)。这会增加困惑和可能的困惑,这对扩展没有帮助。

我的问题..

这个问题是否可以在不进行重大重新部署的情况下得到解决?如果没有,如何构建代码来避免这一问题?是否可以在仍然遵守 YAGNI 的情况下考虑此类要求的变化?

最佳答案

如果类型实现不再有效,通常建议重新开始,有时这是唯一的解决方案。如果定义了接口(interface),您就不能仅仅阻止其他类实现它。

尽管您的问题,正如我所了解到的,更改界面层次结构可以解决它。由于接口(interface) Car 现在更加抽象,因此创建扩展接口(interface) Car 的抽象接口(interface)(接口(interface) SportsCar 等)。此外,您还可以使用 CarImpl 类 来实现抽象程度较低的接口(interface)。

最后,只要定义了 Car 接口(interface),您就无法阻止其他开发人员实例化 Car

关于java - 当类型的实现不再有效时该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38060812/

相关文章:

java - 无法弄清楚为什么我的三角形类上的 x 和 y 坐标被切换

java - 如何制作 GridView 项目( TextView )的 .setText() onItemSelected?

c++ - 为什么不能将继承的 protected 构造函数公开?

java - 《Effective Java》第 16 条(第 2 版)- 转发类仅用于允许重用吗?

objective-c - 为 subview 应用头文件和实现文件

c - 是否可以使用泛型而不是仅使用整数在 C 中实现 StackADT?

java - 拼出时间

JavaMail API : NullPointerException When Accessing Outlook

java - eclipse : list methods and variables of all classes

flash - 如何从由 URLLoader 触发的 Event.COMPLETE 中获取关联的 URLRequest