java中脆弱的基类问题是什么?
答案 0 :(得分:22)
脆弱的基类是继承的常见问题,它适用于Java和支持继承的任何其他语言。
简而言之,基类是您继承的类,它通常被称为脆弱类,因为对此类的更改可能会在从其继承的类中产生意外结果。
减轻这种情况的方法很少;但是在使用继承时没有直接的方法可以完全避免它。您可以通过在Java中将类声明标记为final
来阻止从类继承的其他类。
避免最严重问题的最佳做法是将所有类标记为final,除非您特意打算从它们继承。对于那些打算继承的人来说,就像设计一个API一样设计它们:隐藏所有的实现细节;严格对待你所发出的事情并注意你所接受的内容,并详细记录该课程的预期行为。
答案 1 :(得分:11)
当对其进行的更改破坏派生类时,基类称为fragile。
class Base{
protected int x;
protected void m(){
x++;
}
protected void n(){
x++; // <- defect
m();
}
}
class Sub extends Base{
protected void m(){
n();
}
}
答案 2 :(得分:1)
下面在JavaWorld上的Allen Holub文章中对此进行了广泛的描述
Why extends is evil. Improve your code by replacing concrete base classes with interfaces
答案 3 :(得分:-1)
所有“Colin Pickard”所说的都是真的,在这里我想添加一些最佳实践,以便在编写可能导致Java语言出现此类问题的代码时更加受到保护,特别是如果你是创建框架或库...
public interface MyBehavior {
void doAction();
static class Implementation implements MyBehavior {
public void doAction() {
//do some stuff
}
}
}
// instead of doing extends To a class that have the doAction method
// we will make a [use a] relationShip between the Example class & the Implementation class
public class Example {
private MyBehavior.Implementation helper = new MyBehavior.Implementation();
public void doAction() {
this.helper.doAction();
}
}