【问题标题】:Dependency injection and static methods依赖注入和静态方法
【发布时间】:2018-09-18 23:52:24
【问题描述】:

我想知道如何使静态方法与依赖注入一起工作。
例如:

public class Util {
    Main main;

    public Util(Main main) { this.main = main }

    public static void showMessage() {
        System.out.println("message = " + main.messageMethod());
    }
} 

这有点像我想要做的,但如果我这样做,当我从其他类(如Util.showMessage();)调用方法时,它告诉我 main 为空。
我正在研究如何使这项工作正常工作,因为对于该类的每个静态方法,DI 都会有点烦人。

【问题讨论】:

  • 为什么要做showMessage()static?这看起来像一个实例方法一样完美。
  • @ElliottFrisch 因为它会在许多不同的类上被多次调用,所以如果它是静态的会更容易。
  • 您必须向showMessage 添加一个参数,如showMessage(Main main) 或使main 变量static。还要考虑到您的 showMessage 依赖于 PrintStream,即 System.out,因此您可能也希望对其进行参数化。

标签: java dependency-injection static-methods


【解决方案1】:

您需要将 Main 传递给静态方法:

public static void showMessage(final Main main) {
    System.out.println("message = " + main.messageMethod());
}

编写实用程序类的最佳实践:

  1. 实用程序类/方法必须是无状态的。实用程序类不应有成员。实用方法应该接受所有必需的变量作为参数。可以从并发环境中的多个线程调用实用程序类。可变成员变量使类不是线程安全的,并在并发环境中产生令人讨厌的错误
  2. 实用方法不应被实例化,也不应被注入。它们应该有私有构造函数。
  3. 实用程序类应该是最终的(不可扩展)。

将这些规则应用于您的实用程序类后,它将如下所示:

public final class Util {

    private Util();

    public static void showMessage(final Main main) {
        System.out.println("message = " + main.messageMethod());
    }
}

这个类是最终的(不能扩展),有私有构造函数(不能被实例化或注入),无状态(没有成员,线程安全,如果方法 showMessage 它没有改变主变量的状态)。

【讨论】:

    猜你喜欢
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2011-11-16
    • 1970-01-01
    相关资源
    最近更新 更多