如何在 Java 中扩展最终类

2022-09-01 15:06:17

这是我的问题,实际上我现在正面临。我有一个类,比方说,这个类定义了一个名为返回实例的方法。该类在 内部定义,并声明为 。我想做的是定义一个扩展的类,但我也想通过添加自己的功能(方法,属性等)来扩展。我也想回来。FoogetBarBarBarFoopublic static finalMyFooFooBarMyBargetBarMyBar

问题是最终的。以下是我想做的事情的插图:Bar

public class Foo {

  Bar bar = new Bar();

  public Bar getBar(){
      return bar;
  } 

   ....

   public static final class Bar {

    } 
}

我想做的是:

public class MyFoo extends Foo {


   public MyBar getBar(){ // here I want to return an instance of MyBar

   }

  public static final class MyBar extends Bar { // That's impossible since Bar is final

  } 
}

我怎样才能做到这一点?

[编辑]我正在为我的问题添加更多细节。我实际上正在为Jenkins开发一个插件,经过搜索,我意识到有一个插件提供了我想做的基本功能,并且.我想自定义 和 ,因此它可以满足我的需求。Foo是插件的主类,并扩展了一个名为Builder的类。Foo定义了一个调用的方法,其中包含执行构建的所有操作。 包含用于配置目的的操作,Foo 需要 Bar 来获取这些信息。FooBarFooBarperformBar

所以我想做的是扩展 Foo,并用 添加一些配置。如您所见,将需要通过调用MyFooMyBarMyFoogetBar();

第二件事是我无法控制和的实例化MyFooMyBar

阻碍我的是,我不能扩展Bar。我怎样才能做到这一点?


答案 1

基本上,你不能。它看起来像是设计它不打算扩展的开发人员 - 所以你不能扩展它。您需要寻找不同的设计 - 可能是一个不使用继承的设计......当然,假设您无法更改现有代码。Bar

(如果不更多地了解这里的真正目标 - 整个系统的设计,就很难给出更具体的建议。


答案 2

不能扩展声明 的类。但是,您可以创建一个名为 的中间类。此包装器基本上将包含原始类的实例,并提供替代方法来根据您要执行的操作修改对象的状态。finalWrapper

当然,这不会提供对类的私有和受保护字段的访问权限,但您可以使用其 getters 和 setters 方法,结合您在类中声明的新方法和字段,以获得您想要的结果,或者相对接近的结果。finalWrapper

另一种解决方案是,如果没有正当理由声明类,则不声明该类。final


推荐