2

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

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

我知道什么时候用哪个。我也明白
抽象是一种减少和分解细节的机制和实践,以便一次可以专注于几个概念。

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

各位高手能不能花点时间回答我,增加我的见识?

提前致谢。

4

5 回答 5

3

想到的一种反模式是将常量(作为公共静态最终变量)放在抽象类和接口上,然后这些常量的用户实现接口或扩展抽象类。所谓这样做的好处是常量不需要每次使用时都进行限定。例如MyConstants.MY_VALUEMY_VALUE

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

于 2013-05-24T06:39:56.670 回答
2

也许当您明确地只想要一个实现时,您就不必维护同一事物的两个版本。final在这种情况下也可能会上课。

于 2013-05-24T05:00:16.577 回答
1

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

于 2013-05-24T04:30:36.793 回答
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;
    }
}
于 2013-05-24T05:19:29.440 回答
0

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

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

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

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

其中之一是有很多方法可以做到这一点,并且方法与您想要编织(包装)的确切 bean(类实例)不同。诸如“类是否实现接口”、“类是否扩展类”之类的东西在这里很重要。

我不会在这里深入探讨细节,只是因为我很早之前就在这个问题上苦苦挣扎,但是您可以从简要讨论此问题的spring 文档中了解您必须处理的内容。

我会说,在我的项目中,当我决定添加扩展另一个类并实现一些接口的类时,事情出了问题。让事情正常工作是一个相当大的挑战,因为您必须对 Spring 本身和 AOP 编织技术如何工作以及如何配置所有这些东西以使其按预期工作有非常好的理解。

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

于 2013-05-24T05:54:27.657 回答