Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是脆弱的基类问题?_Java_Oop - Fatal编程技术网

Java 什么是脆弱的基类问题?

Java 什么是脆弱的基类问题?,java,oop,Java,Oop,java中的脆弱基类问题是什么?脆弱基类是继承的常见问题,适用于java和任何其他支持继承的语言 简而言之,基类就是您要从中继承的类,它通常被称为脆弱类,因为对该类的更改可能会在从它继承的类中产生意外的结果 缓解这种情况的方法很少;但是没有一种简单的方法可以在仍然使用继承的情况下完全避免它。通过在Java中将类声明标记为final,可以防止其他类从类继承 避免这些问题中最糟糕的一个最佳实践是将所有类标记为final,除非您特别打算从它们继承。对于那些打算从中继承的人,将其设计为一个API:隐藏所

java中的脆弱基类问题是什么?

脆弱基类是继承的常见问题,适用于java和任何其他支持继承的语言

简而言之,基类就是您要从中继承的类,它通常被称为脆弱类,因为对该类的更改可能会在从它继承的类中产生意外的结果

缓解这种情况的方法很少;但是没有一种简单的方法可以在仍然使用继承的情况下完全避免它。通过在Java中将类声明标记为
final
,可以防止其他类从类继承


避免这些问题中最糟糕的一个最佳实践是将所有类标记为final,除非您特别打算从它们继承。对于那些打算从中继承的人,将其设计为一个API:隐藏所有的实现细节;严格控制您发出的内容,小心您接受的内容,并详细记录类的预期行为。

当对基类所做的更改破坏派生类时,基类称为脆弱类

class Base{
    protected int x;
    protected void m(){
       x++;
    }

    protected void n(){
      x++;      // <- defect 
      m();
     }
 }


class Sub extends Base{
        protected void m(){
            n();
        }
    }
类基{
受保护的int x;
受保护的void m(){
x++;
}
受保护的void n(){
x++;//所有“Colin Pickard”所说的都是真的,在这里我想添加一些最佳实践,以便在您编写可能导致Java语言出现此类问题的代码时,尤其是在您正在创建框架或库的情况下,得到更大的保护

  • 默认情况下,将所有具体类设置为最终类,因为您可能不希望继承它们 您发现这种行为与Kotlin langage一样具有许多语言的特性(如果您需要扩展它,那么可以删除最后一个关键字,这样可以帮助代码的读者)
  • 对于抽象类,使其所有实现的方法最终不被其子类修改(即使受保护的方法一般来说也是一个坏主意,子类不应该对其子类了解太多),如果它们不打算被重写,则不要公开您的方法
  • 尝试不使用关系[is a],而尝试使用类之间的[uses a]Relationshiap关系图使用接口来避免扩展问题
  • 请记住,每个扩展都可以由实现替换,如果您必须进行默认实现,这里有一个代码spinet:
  • 公共接口行为{
    无效动作();
    静态类实现实现MyBehavior{
    公共无效行为(){
    //做点什么
    }
    }
    }
    //而不是扩展到具有doAction方法的类
    //我们将在示例类和实现类之间建立[使用]关系
    公开课范例{
    私有MyBehavior.Implementation helper=新的MyBehavior.Implementation();
    公共无效行为(){
    this.helper.doAction();
    }
    }
    
    艾伦·霍卢布(Allen Holub)在下面关于JavaWorld的文章中对此进行了广泛的描述


    抵制引用重大奖项或NIN专辑的冲动…很抱歉打断你,@scunliffe,但你失败了;-)如果有人说FBC的问题是基类的指定了契约,这样更改类可能会破坏依赖它的派生类,这就足够了吗?我们可以拥有派生接口吗,顺便说一句?当对父类的简单更改破坏子类时,它是脆弱的。如果您更改父类中的所有内容并导致子类破坏,这并不一定意味着父母是脆弱的;如果你改变了一些看似良性的事情,而事情又土崩瓦解了,那么它是脆弱的。那么,哪些改变是简单的,即标准是什么?