当前位置: 首页 > 知识库问答 >
问题:

如何在Java中扩展final类

锺星腾
2023-03-14

这是我现在面临的问题。我有一个类,假设 Foo,这个类定义了一个名为 getBar 的方法,该方法返回一个 Bar 实例。类 BarFoo 内部定义,并被声明公共静态 final。我想做的是定义一个扩展Foo的类MyFoo,但我也想通过添加我自己的功能(方法,属性等)来扩展Bar。我也希望getBar返回MyBar

问题是< code>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 开发一个插件,搜索后,我意识到有一个插件提供了我想做的基本功能FooBar。我想定制FooBar,所以它可以满足我的需求。Foo是插件的主要类,并扩展了一个名为Builder的类。Foo定义了一个名为执行的方法,其中包含执行构建的所有操作。Bar 包含用于配置目的的操作,Foo 需要 Bar 来获取这些信息。

所以我想做的是用MyFoo扩展Foo,并使用MyBar添加一些配置。如您所见,MyFoo需要通过调用getBar()来获取这些配置;

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

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

共有3个答案

伏默
2023-03-14

你不能扩展最终类 - 这就是最终关键字的目的。

但是,(至少)有两种解决方法:

  1. 该类位于 Jenkins 项目中,该项目是开源的,因此您只需下载项目,对类进行所需的更改并重新构建 jar
  2. 即可。
  3. 有点黑客,但你可以使用像Javassist这样的库来替换内存中类的实现
何峰
2023-03-14

不能扩展声明为< code>final的类。但是,您可以创建一个中间类,称为< code>Wrapper。这个包装器将基本上包含原始类的一个实例,并根据您想要做的事情提供替代方法来修改对象的状态。

当然,这不会让私人

另一种解决方案是,如果没有有效的理由,不要声明<code>final</code>类。

夏意蕴
2023-03-14

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

(在不了解更多这里的真正目的——整体系统的设计的情况下,很难给出更具体的建议。)

 类似资料:
  • 问题内容: 这实际上是我现在面临的问题。我有一个类,可以说该类定义了一个返回实例的方法。该类在内部定义并声明。我想要做的就是定义一个类扩展,但我也想对与加入我自己的功能(方法,属性等)。我也想回来。 问题是最终的。这是我想做的事的例证: 我想做的是: 我该如何实现? [编辑]我正在向我的问题添加更多详细信息。我实际上是在为Jenkins开发一个插件,经过搜索,我意识到有一个插件提供了我想做的基本功

  • 遵循以下文档:http://guides.micronaut.io/micronaut-database-authentication-provider-groovy/guide/index.html,您可以为auth/auth创建一个DB/DAO。如果为UserFetcher、PasswordEncoder和AuthoritiesFetcher提供实现,那么最好使用默认的DelegatingAu

  • 在我的项目中,我使用预定义的注释: 的源代码: 我想编写自定义注释,它将与使用(Secure.class)的

  • 关于MapStruct的问题。我有这样的情况,我从基实体扩展类,但不知道如何映射它。这是我的箱子。 BaseEntity: 基础: 没有显示错误,在映射器实现(生成的代码)中没有该ID的映射:

  • 问题内容: 我有以下课程。 和 我对自定义异常何时应该扩展以及何时必须扩展感到困惑。您能否解释一下直接扩展是否有任何缺点? 谢谢! 问题答案: 不选中RuntimeException,而选中Exception(调用代码必须处理它们)。 如果您 想取消选中 自定义异常,则应扩展 它, 否则请使用扩展它。 对于未经检查的异常,不需要调用代码方法在throws子句中声明在方法执行期间可能抛出但未被捕获的

  • 问题内容: 当我在Windows上进行多平台测试时,由于我在特殊的Mac自定义任务中拥有com.apple.eawt代码,因此Eclipse在项目中显示错误变得很烦人。更糟糕的是,如果我在Windows上导出可运行的jar,则由于未解决的编译问题,它将无法在mac上运行。 让Windows Java和com.apple.eawt和平共处的最佳方法是什么?我看不到如何将代码剥离到jar中,因为它需要