我在面试中被问到 哪个场景不应该使用抽象类和接口?
我无法用当时你不想这样做的具体例子清楚地回答他的问题。我通过示例搜索了很多具体答案但无法找到。
我知道何时使用哪一个。 另外我明白了 抽象是一种减少和分解细节的机制和实践,因此人们可以一次关注一些概念。
我可以回答,当我没有发现任何关系时,我不应该使用它。
你们是否会花一分钟时间回答我以增加我的知识?
提前致谢。
答案 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 /代码生成的代码中同时扩展抽象类和实现接口。