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

仅使用静态方法对类进行依赖注入?

慎峻
2023-03-14

我有一组仅包含静态方法和单个私有构造函数的API类,因此它们无法实例化。但是,我希望第三方开发人员能够修改API的行为以满足他们的需求。

这是我目前为止的解决方案(通过静态setter方法进行依赖注入)。这是开发人员将使用的公共API类。如您所见,它依赖于< code>StaticApiImpl。

public class StaticApi {
    private static StaticApiImpl impl = new StaticApiImpl();

    private StaticApi() {}

    public static void setImpl(StaticApiImpl impl) {
        StaticApi.impl = impl;
    }

    public static void doThing() {
        impl.doThing();
    }
}

这是我自己编码的默认API实现。

public class StaticApiImpl {
    public void doThing() {
        System.out.println("Do thing the default way.");
    }
}

这是第三方可能编写的默认实现的假设扩展版本:

public class MyCustomStaticApiImpl extends StaticApiImpl {
    @Override
    public void doThing() {
        System.out.println("Do thing differently.");
    }
}

开发者只需在插件初始化时通过setter方法注入他们的依赖关系:

public void onLoad() throws Exception {
    StaticApi.setImpl(new MyCustomStaticApiImpl());
}

我的问题是:这是正确的做法吗?是否有一些设计模式专门用于此类案例,我从未听说过?

共有2个答案

程枫
2023-03-14

第三方开发人员的最佳解决方案是使用< code >代理模式。

http://en.wikipedia.org/wiki/Proxy_pattern

将实现对象设置为实例并不是一个好的解决方案。

钱振
2023-03-14

您在这里设置的是一个工厂模式,客户可以配置工厂返回哪个实现。这很好,但是有几件事你需要改变。

  1. 将<code>StaticApi。这将使其角色更加明确,并避免与下一部分的命名冲突
  2. 删除<code>公共静态void doSomething()
  3. 创建一个定义API行为契约的接口<code>StaticApi<code>。然后,工厂类应该允许客户端<code>setImpl(静态API)</code>
  4. 现在,任何需要使用StaticApi的人都可以通过<code>StaticApi工厂.getInstance()</code>获得引用
 类似资料:
  • 例如,Foos的资源可能如下所示: 对于酒吧:

  • 我有一个包使用spring依赖注入进行单元测试,使用下面的代码。 我需要在util类中添加一个静态方法,并需要对其进行模拟,以防止现有的单元测试失败。我尝试使用PowerMock,但得到了不同的错误,如下面的错误。

  • 从零开始,没有任何以前的Jersey 1.x知识,我很难理解如何在我的Jersey 2.0项目中设置依赖注入。 我也知道HK2在Jersey 2.0中可用,但我似乎找不到有助于Jersey 2.0集成的文档。 我可以让容器启动并提供我的资源,但是当我将@inject添加到MyService时,框架就会抛出一个异常: 我的starter项目可在github:https://github.com/do

  • 我尝试在我的活动中注入修改,但我得到了空异常 这是AndroidApplication类

  • 好的,到目前为止还好。但是等等,突然A需要额外的输入,比如一个对它的构造至关重要的名为“amount”的整数。现在,我的A构造函数需要如下所示: 突然这个新参数干扰了注射。此外,即使这确实有效,我也无法在从提供者检索新实例时输入“金额”,除非我弄错了。这里有几件事我可以做,我的问题是哪一件是最好的? 我可以通过添加一个方法来重构A,该方法应该在构造函数之后调用。然而,这是很难看的,因为它迫使我推迟

  • 我试图在我的程序中使用accessors(Set/Get)方法,当我试图在main方法中使用Get方法时,我得到了以下错误: 无法从Student类型对非静态方法进行静态引用。 我不确定如何着手解决这个问题。我是Java编程的初学者。 以下是具体的问题: 设置/获取方法: 错误行: 任何建议都将不胜感激* 我的代码的完整图片。