【问题标题】:I have a question about some code in java application我对 java 应用程序中的一些代码有疑问
【发布时间】:2019-09-16 15:14:18
【问题描述】:

这两个定义有什么区别?

public class MainClass {
    //definition one
    private static MainClass main = new MainClass();
    //definition two
    private static MainClass main2 = MainClass.getMain2();

    public static void main(String[] args) {

    }

    private static MainClass getMain2() {
        return main2;
    }

}

哪个更好?

【问题讨论】:

  • 您明白,如果您不使用new 关键字,您就不会创建对象,对吧?所以将main2 初始化为自身只会将其保留为null?
  • 除了那个非描述性的标题(请阅读How to Ask)之外,main 的初始化更好。为什么?因为main2 不会做你所期望的......(试试吧)。
  • 看起来你在创建类的实例和从单例或类似的东西中获取实例之间感到困惑。 main() 方法也无关紧要,这只是您的入口点。你的意思是写一个默认的构造函数?
  • 第一个是创建(并分配)一个新实例;第二个只是分配方法返回的内容(在这种情况下,分配给的字段,所以它实际上是一个无操作)

标签: java static private


【解决方案1】:

我认为你的代码是错误的。这个方法应该在其他一些类中。应该是这样的

private static MainClass getMain2() {
    return new MainClass();
}

这叫做依赖注入。

您的代码应如下所示

public class MainClass {
    //definition one
    private static MainClass main = new MainClass();
    //definition two  
    private static MainClass main2 = MainClass.getMain2();

    public static void main(String[] args) {

    }

    //constructor injection
    private static MainClass( MainClass a) {
       this.main2  = a;
    }
    //Or in place of constructor injection you can use Setter injection
    public static setMain2( MainClass a) {
        this.main2  = main2;
    }

@Thiago Arrais 在What is dependency injection? 上的回答很容易理解,无需认真的编码/框架知识 -

The best definition I've found so far is one by James Shore:

“依赖注入”是 5 美分概念的 25 美元术语。依赖注入意味着给一个对象它的实例变量。

Martin Fowler 的一篇文章可能也很有用。

依赖注入基本上是提供对象需要的对象(它的依赖项),而不是让它自己构造它们。这是一种非常有用的测试技术,因为它允许模拟或删除依赖项。

可以通过多种方式将依赖项注入对象(例如构造函数注入或setter注入)。甚至可以使用专门的依赖注入框架(例如 Spring)来做到这一点,但它们当然不是必需的。您不需要这些框架来进行依赖注入。显式实例化和传递对象(依赖项)与框架注入一样好。

【讨论】:

  • 我认为你的//constructor injection 方法需要使用a 而不是main2。
  • @Jamie 搞错了。已更正。
猜你喜欢
  • 2019-03-29
  • 1970-01-01
  • 2011-01-30
  • 2019-06-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多