Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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 静态方法或DI_Java_Dependency Injection - Fatal编程技术网

Java 静态方法或DI

Java 静态方法或DI,java,dependency-injection,Java,Dependency Injection,一般来说,我对Java或编程都是新手,通常我会将主类的实例作为静态方法,以便从其他类轻松访问它。 例如 私有静态主实例然后我会为它做一个getterpublicstaticmain getInstance(),在其他类上我只需做Main.getInstance().otherMethods()以获取在主类上声明的其他方法和变量 最近有人告诉我不建议这样做,并告诉我应该使用依赖注入。我的问题是为什么我不应该在Java中使用它,为什么依赖注入会更好?使用这种方法或只是将其作为方法参数传递之间有什么区

一般来说,我对Java或编程都是新手,通常我会将主类的实例作为静态方法,以便从其他类轻松访问它。 例如
私有静态主实例
然后我会为它做一个getter
publicstaticmain getInstance()
,在其他类上我只需做
Main.getInstance().otherMethods()
以获取在主类上声明的其他方法和变量


最近有人告诉我不建议这样做,并告诉我应该使用依赖注入。我的问题是为什么我不应该在Java中使用它,为什么依赖注入会更好?使用这种方法或只是将其作为方法参数传递之间有什么区别?它的优点和缺点是什么?

关于这一点,已经有很多问题和答案了。你可以搜索“为什么DI”来获得很多关于原因的理论。例如:

DI的主要优势是:

  • 灵活性——如果您需要更换一个组件,或者使用多个组件而不是单个组件,那么DI只允许您通过一些更改来调整代码

  • 更容易进行单元测试-您可以将依赖项组件的模拟实现注入到正在测试的组件中,并且只测试目标组件

一个真实的例子:

我曾经见过一个使用单例数据库访问类的项目。整个应用程序中只有一个全局常数:

public static final DB_INSTANCE = ...;
在整个应用程序中都使用了,如下所示:

DB_INSTANCE.runQuery("SELECT ...");

然后,特性请求能够同时处理多个数据库(类似于“切分”)。
DB\u实例
singleton表示一个数据库,因此此功能需要重写成吨的代码行—组件现在已将“DB实例”注入其中。

首先,依赖项注入不是特定于java的。这是一种误解。这在很多其他语言中都是个好主意。无论您使用什么以及关注点分离的具体实例,从业务逻辑中分离粘合代码(这就是依赖项注入)都是一个好主意。这不是个坏主意。你应该在你使用的每种语言中都这样做。对于不同的语言,您是如何做到这一点的

第二:它是一种设计模式,而不是框架。当然,有几种很好的Java框架可以实现这一点,当然,您可能希望使用它们。手动编写粘合代码是一件很愚蠢的工作。自动化是个好主意

其工作原理是简单地应用一些规则:

  • 包含业务逻辑的代码模块/类/对象/函数等不会创建它们自己需要的任何东西(也称为依赖项)。相反,他们所需要的一切都是通过参数(也称为注入)提供给他们的。在Java中,最好的地方是构造函数。Setter注入也是一件事,但构造函数注入是您应该做的
  • 构建/构造/初始化/配置(如构造函数、主方法、beforeTest方法等)的代码不应该做其他工作:不要将业务逻辑放在这里。这就是胶水代码的用途。粘合代码不应与业务逻辑混合
  • 就这样。简单。创建东西,在需要的地方注入。坚持这样做。如果你发现你需要在一个地方注入很多东西,那就是一个耦合性和内聚性的问题:修复它,因为你的设计被破坏了


    这里没有特定于Java的内容。这是应用坚实原则的逻辑结果。你不能这样做,也不能不做依赖注入。您可以在Javascript、Ruby、python、Haskell、lisp等语言中实现这一点。每当您听说代码难以测试或维护时,您就会发现人们将胶水代码和逻辑混合在一起,造成了一片混乱。这些语言中的每一种都有很好的习惯用法来实现这一点。

    看起来您使用的是单例模式(或者至少是对其进行了编译的东西;我希望您的类的构造函数是私有的!),因此我建议您只需搜索“单例vs DI”,您就会找到很多关于此主题的文章。您可能想阅读。