我有一个关于java应用程序中的一些代码的问题

我有一个关于java应用程序中的一些代码的问题,java,static,private,Java,Static,Private,这两个定义有什么区别 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) { } pr

这两个定义有什么区别

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;
    }

}

哪个更好?

我认为你的代码错了。此方法应该在其他类中。应该是

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的回答很容易理解,不需要认真的编码/框架知识-

The best definition I've found so far is one by James Shore:
“依赖注入”是一个25美元的术语,用于表示5美分的概念。依赖注入意味着为对象提供实例变量。

马丁·福勒的一篇文章可能也很有用

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


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

您知道,如果不使用
new
关键字,就不会创建对象,对吗?因此,初始化
main2
本身只会将其保留为
null
?除了非描述性标题(请阅读)之外,
main
的初始化效果更好。为什么?因为
main2
不会做您期望的事情。。。(试一试)。看起来您正在混淆创建类的实例和从单例或类似对象获取实例。main()方法也是不相关的,这只是您的入口点。您的意思是要编写一个默认构造函数吗?第一个是创建(并分配)一个新实例;第二种方法只是分配一个方法返回的内容(在这种情况下是分配给的字段,因此它实际上是一个无操作)。我认为您的
//构造函数注入
方法需要使用
a
而不是main2。@Jamie犯了一个错误。更正。