Java 打破依赖

Java 打破依赖,java,dependency-injection,Java,Dependency Injection,我从未深入研究过Java。最近,我不得不处理一个我想调查的行为,因为我还没有完全理解它 你能给我解释一下为什么主包不需要导入b包吗?虽然aa方法的参数是B类型 此代码工作正常 这种特殊情况可以看作是内嵌依赖注入吗 package c; import b.*; public class C { B b=new B(); public B cc(){ return b; } } package a; import b.*; public cla

我从未深入研究过Java。最近,我不得不处理一个我想调查的行为,因为我还没有完全理解它

你能给我解释一下为什么主包不需要导入b包吗?虽然aa方法的参数是B类型

此代码工作正常

这种特殊情况可以看作是内嵌依赖注入吗

package c;
import b.*;
public class C {
    B b=new B(); 

    public B cc(){ 
        return b; 
    }

}

package a;
import b.*; 

public class A {

    public void aa(B b) {}
}


package b; 
public class B {}



import a.A; 
import c.C; 

public class Test {

    public static void main(String[] args) {

        A a = new A(); 
        C c = new C();
        a.aa(c.cc()); 
        System.out.print("Test"); 
    }
}

您只需要导入源代码中明确提到的类型。调用
cc
方法时,编译器已经很清楚返回值是哪种类型。导入只是为了消除在完全限定类型名
B.B
中提到
B
的歧义


不,这与依赖注入无关。在这个短语中,“依赖关系”指的是一个对象对另一个对象的运行时依赖关系,与Java类型之间的编译时依赖关系无关。

您只需要导入源代码中明确提到的类型。调用
cc
方法时,编译器已经很清楚返回值是哪种类型。导入只是为了消除在完全限定类型名
B.B
中提到
B
的歧义


不,这与依赖注入无关。在这个短语中,“依赖性”是指一个对象对另一个对象的运行时依赖性,与Java类型之间的编译时依赖性无关。

这是开发/设计应用程序的正确方法还是应该避免?打破编译时依赖关系可以增加系统的灵活性吗?是否有任何模式可以表达这个概念?导入语句不是用来表达编译时依赖关系的,如果这是您的意思的话。我不知道你的问题中“this”是什么意思。我本可以使用对象B来存储cc的返回值,但这会在测试包和B之间创建编译时依赖关系。。。当使用cc方法的返回值作为aa方法的参数时,我避免了它!我的问题是,这是面对这种情况的正确方式吗?不,它没有避免,依赖性仍然存在。它所避免的只是一个import语句,正如我所说的,import语句不是关于枚举类依赖关系,而是关于非限定名称的解析。好吧,如果您在运行时从未实例化
C
,或以任何其他方式涉及
B
,那么是的,您的程序将在
B
类不存在的情况下工作。但是您没有通过使
C
不导入
B
来实现这一点——即使有导入语句,代码也可以在没有
B
的情况下工作。导入语句(几乎)与编译时或运行时依赖项无关。这是开发/设计应用程序的正确方法还是应该避免?打破编译时依赖关系可以增加系统的灵活性吗?是否有任何模式可以表达这个概念?导入语句不是用来表达编译时依赖关系的,如果这是您的意思的话。我不知道你的问题中“this”是什么意思。我本可以使用对象B来存储cc的返回值,但这会在测试包和B之间创建编译时依赖关系。。。当使用cc方法的返回值作为aa方法的参数时,我避免了它!我的问题是,这是面对这种情况的正确方式吗?不,它没有避免,依赖性仍然存在。它所避免的只是一个import语句,正如我所说的,import语句不是关于枚举类依赖关系,而是关于非限定名称的解析。好吧,如果您在运行时从未实例化
C
,或以任何其他方式涉及
B
,那么是的,您的程序将在
B
类不存在的情况下工作。但是您没有通过使
C
不导入
B
来实现这一点——即使有导入语句,代码也可以在没有
B
的情况下工作。导入语句(几乎)与编译时或运行时依赖项无关。