在哪种情况下不应使用抽象类和接口?

时间:2013-05-24 04:03:53

标签: java

我在面试中被问到 哪个场景不应该使用抽象类和接口?

我无法用当时你不想这样做的具体例子清楚地回答他的问题。我通过示例搜索了很多具体答案但无法找到。

我知道何时使用哪一个。 另外我明白了 抽象是一种减少和分解细节的机制和实践,因此人们可以一次关注一些概念。

我可以回答,当我没有发现任何关系时,我不应该使用它。

你们是否会花一分钟时间回答我以增加我的知识?

提前致谢。

5 个答案:

答案 0 :(得分:3)

我想到的一个反模式是将常量(作为公共静态最终变量)放在抽象类和接口上,然后这些常量的用户实现接口或扩展抽象类。所谓的优点是每次使用时常数都不需要合格。例如MyConstants.MY_VALUE vs MY_VALUE

使用Java 1.5及更高版本,现在可以使用静态导入来避免必须使用类名限定常量。虽然我个人并不介意使用类名限定常量,特别是如果常量的类名具有有意义的“分组”名称。

答案 1 :(得分:2)

也许当你明确只想要一个实现时,你就不会维护同一个东西的两个版本。在这种情况下,人们也可能会成为班级final

答案 2 :(得分:1)

我有一个想法。可能是您的类包含一组静态实用程序。例如StringUtils。但无论如何,我认为你写的这个问题没有多大意义。

答案 3 :(得分:0)

我认为2个案例

1:如果你必须实例化你的类的对象(eg: MyClass object=new MyClass()

2:如果继承与父类相同的实现,例如:

class Parent {
    int x;

    public void setX(int x) {
        this.x = 2 * x;
    }
}

class Child extends Parent {
    int y = 1;

    public void setX_AND_Y(int x, int y) {
        setX(x); // same implmentaion
        this.y = y;
    }
}

答案 4 :(得分:0)

我遇到了一些问题,因为spring bean必须实现接口并在过去扩展一些基类。

这是一个与AOP和Spring相关的高级问题,所以我不能100%确定这是你的面试官所要求的,但这完全是你可以在野外偶然发现的东西,而不仅限于Spring。

通常你想在你的Spring应用程序中添加AOP(例如使用@Transactional注释)。问题在于,有几种方法可以实现AOP,从编译时的字节码或加载时间修补字节码,到运行时生成类似于包装器的东西。

后一种方法是最便宜的,构建结构方面的,并且比其他方法更常用,但它有它的缺点。

其中一个是有很多方法可以做到这一点,方法与你想要编织(包装)的确切bean(类实例)不同。就像“是否实现类接口”,“类是否扩展类”和组合在这里一样重要。

我不会深入研究这里的细节,仅仅因为我在很久以前一直在努力解决这个问题,但你可以从spring docs简要讨论这个问题来掌握你将要处理的事情。< / p>

我会说,在我的项目中,当我决定添加扩展另一个类并实现一些接口的类时出错了。让事情发挥作用是一个相当大的挑战,因为你必须对Spring本身和AOP编织技术的运作方式有很好的理解,以及如何配置所有这些东西,以便它们按预期工作。

更新:用一句话回答您的问题:您可能不希望在处理动态类代理/ AOP /代码生成的代码中同时扩展抽象类和实现接口。